Oneliner计算文件每行中的选项卡数量

Jas*_*ner 4 powershell

我有一个以制表符分隔的文件.我想要一个powershell脚本来计算每行中的选项卡数量.我想出了这个:

${C:\tabfile.txt} |% {$_} | Select-String \t | Measure-Object | fl count
Run Code Online (Sandbox Code Playgroud)

它产生3,这是文件中的行数.

我做错了什么指针?我希望它为文件中的每一行打印一个数字.

Ric*_*erg 6

您的代码有两个问题,但它们都围绕分组/数组管理/嵌套循环.

gc test.txt | % { ($_ | select-string `t -all).matches | measure | select count }
Run Code Online (Sandbox Code Playgroud)
  • 将文本文件读入行后,需要将管道的其余部分包装成一个脚本块.否则,下游cmdlet无法区分哪些元素来自"当前"行.PS管道就是一个接一个地处理对象 - 没有嵌套数组或迭代器状态或其他任何东西的概念 - 盲目枚举.
  • 您需要指定-AllMatches,否则select-string将在每行找到第一个匹配后立即停止.然后,您需要从其标称结果集中获取Matches属性,以获取此内部匹配的"内部结果集".


Joe*_*oey 5

第一次尝试,不是很复杂:

gc .\tabfile.txt | % { ($_ -split "`t").Count - 1 }
Run Code Online (Sandbox Code Playgroud)

利用这里的事实,当我将字符串拆分为制表符时,我将得到一个数组,其中包含的项目多于该行中的制表符.

另一种方法,避免分裂线:

gc .\tabfile.txt | % { ([char[]] $_ -eq "`t").Count }
Run Code Online (Sandbox Code Playgroud)

字符串可以转换为char[](也有ToCharArray()方法),然后我通过返回所有匹配的项而不是布尔值来使用比较运算符在集合上的工作方式不同的事实.因此比较会返回一个数组,其中包含原始行中的所有选项卡,我只需从中获取项目数.