Эквивалент 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