Как вы считаете последовательные строки в файле с помощью powershell? - PullRequest
2 голосов
/ 24 марта 2019

Итак, я хочу знать, как я могу получить содержимое из файла и подсчитать количество последовательных вхождений строки в этом файле? Итак, мой файл имеет следующие строки:

1
1
1
0
0
0
0
1
1
1
0
1
1
0
0
0
1
0
1
1
1
0
0

Теперь я почти ничего не знаю о powershell, но знаю bash, поэтому, если кто-то понимает и то и другое, это мой желаемый эффект:

[me@myplace aaa8]$ cat fule1|uniq -c
      3 1
      4 0
      3 1
      1 0
      2 1
      3 0
      1 1
      1 0
      3 1
      2 0

И если это возможно, также добавьте эквивалент PowerShell sort -hr: D

[me@myplace aaa8]$ cat fule1|uniq -c|sort -hr
      4 0
      3 1
      3 1
      3 1
      3 0
      2 1
      2 0
      1 1
      1 0
      1 0

Итак, в основном это говорит о том, что у моего файла самая длинная полоса из 4 нулей и т. Д.

Есть ли способ сделать это с powershell?

1 Ответ

1 голос
/ 24 марта 2019

Эквивалент PowerShell для утилиты uniq, командлет Get-Unique , к сожалению, не имеет эквивалента для опции -c первого для добавления числа подряд повторяющиеся строки (по состоянию на PowerShell v6.2).

Примечание. Усовершенствование Get-Unique для поддержки -c -подобной функции и других функций, предлагаемых утилитой uniq POSIX , является предметом запроса на GitHub. .

Следовательно, вы должны свернуть свое собственное решение :

function Get-UniqueWithCount {

  begin {
    $instanceCount = 1; $prevLine = $null
  }

  process {
    if ($_ -eq $prevLine) {
      ++$instanceCount
    } elseif ($null -ne $prevLine) {
      [pscustomobject] @{ InstanceCount = $instanceCount; Line = $prevLine }
      $instanceCount = 1
    }
    $prevLine = $_
  }

  end {
    [pscustomobject] @{ InstanceCount = $instanceCount; Line = $prevLine }
  }

}

Вышеуказанная функция принимает входные данные из конвейера (объект за объектом обозначается $_ в блоке process { ... }). Он сравнивает каждый объект (строку) с предыдущим и, если они равны, увеличивает количество экземпляров; как только будет найдена другая строка, будет выведена предыдущая строка с количеством экземпляров в виде объекта со свойствами InstanceCount и Line. Блок end { ... } выводит конечный объект вывода для последнего блока идентичных последовательных строк. См. about_Functions_Advanced .

Затем вызовите его следующим образом:

Get-Content fule | Get-UniqueWithCount

что дает:

InstanceCount Line
------------- ----
            3 1
            4 0
            3 1
            1 0
            2 1
            3 0
            1 1
            1 0
            3 1
            2 0

Поскольку Get-UniqueWithCount удобно выводит объекты , чьи набрали свойства , на которые мы можем действовать, эквивалент sort -hr (сортировка по встроенным числам (* 1053) *), в порядке убывания (обратного) (-r)) легко:

Get-Content fule | Get-UniqueWithCount | Sort-Object -Descending InstanceCount

, что дает:

InstanceCount Line
------------- ----
            4 0
            3 1
            3 1
            3 0
            3 1
            2 1
            2 0
            1 0
            1 1
            1 0
...