Oneliner для подсчета количества вкладок в каждой строке файла - PullRequest
4 голосов
/ 12 августа 2009

У меня есть файл с разделителями табуляции. Я хотел бы скрипт PowerShell, который считает количество вкладок в каждой строке. Я придумал это:

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

это дает 3, которое является количеством строк в файле.

какие-нибудь указатели на то, что я делаю не так? Я хотел бы, чтобы он напечатал одно число для каждой строки в файле.

Ответы [ 4 ]

6 голосов
/ 12 августа 2009

Пара проблем с вашим кодом, но все они вращаются вокруг группировки / управления массивами / вложенных циклов.

gc test.txt | % { ($_ | select-string `t -all).matches | measure | select count }
  • После прочтения текстового файла в строки, вам нужно обернуть оставшуюся часть конвейера в блок скриптов. В противном случае нижестоящие командлеты не могут различить, какие элементы пришли из «текущей» строки. Конвейер PS предназначен для работы с объектами один за другим - здесь нет понятия вложенных массивов, состояния итератора или чего-либо еще - слепого перечисления.
  • Вам нужно указать -AllMatches, иначе select-string остановится, как только найдет первое совпадение в каждой строке. Затем вам нужно получить свойство Matches из его номинального набора результатов, чтобы получить «внутренний набор результатов» этого внутреннего сопоставления.
5 голосов
/ 12 августа 2009

Первая попытка, не очень сложная:

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

Используя здесь тот факт, что, когда я разделю строку по символам табуляции, я получу массив с еще одним элементом, чем вкладок в строке.

Другой подход, избегающий разделения строк:

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

Строки могут быть приведены к char[] (также существует метод ToCharArray()), тогда я использую тот факт, что операторы сравнения работают по-разному в коллекциях, возвращая все соответствующие элементы вместо логического. Таким образом, сравнение возвращает массив, содержащий все вкладки из исходной строки, из которой мне просто нужно получить количество элементов.

4 голосов
/ 14 августа 2009

И еще один вариант, если вы используете V2.

select-string \t c:\tabfile.txt -All | 
    %{"$($_.matches.count) tabs on $($_.LineNumber)"}
2 голосов
/ 12 августа 2009

Другой вариант:

$content = Get-Content file.txt | Out-String
[regex]::matches($content,"\t").count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...