一个Liner用于计算文件每行中的选项卡数量

时间:2009-08-11 21:46:37

标签: powershell

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

${C:\tabfile.txt} |% {$_} | Select-String \t | Measure-Object | fl count

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

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

4 个答案:

答案 0 :(得分:6)

您的代码存在一些问题,但它们都围绕分组/数组管理/嵌套循环。

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

答案 1 :(得分:5)

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

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

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

另一种避免分割线的方法:

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

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

答案 2 :(得分:4)

如果您正在运行V2,还有另一种选择。

select-string \t c:\tabfile.txt -All | 
    %{"$($_.matches.count) tabs on $($_.LineNumber)"}

答案 3 :(得分:2)

另一种选择:

$content = Get-Content file.txt | Out-String
[regex]::matches($content,"\t").count