Удалить все строки, которые содержат повторяющиеся слова - PullRequest
1 голос
/ 19 марта 2019

Я хочу удалить все строки, содержащие одну строку, и оставить только последнюю строку.

Например:

1
2
3
б 1
b 2

Я хочу удалить:

a 1
a 2
b 1

и оставить только последние строки:
a 3
b 2.

Я пробовал что-то в PowerShell, но без успеха:

gc 1.txt | sort | get-unique

1 Ответ

0 голосов
/ 19 марта 2019

Предполагая, что вы хотите:

  • Рассмотрим строки, которые в начале имеют одно и то же слово (a или b в вашем примере) как группу,

  • и вернуть последнюю строку из каждой такой группы,

используйте командлет Group-Object:

Get-Content 1.txt | Group-Object { (-split $_)[0] } | ForEach-Object { $_.Group[-1] }
  • { (-split $_)[0] } использует свойство выражение через блок сценария ({ ... }, а не свойство name в качестве критерия группировки.

  • -split $_ разбивает каждую входную строку ($_) на массив подстрок по пробелу .

  • (...)[0] извлекает 1-й токен, то есть первый разделенный пробелами токен в строке (a или b, в ваших данных выборки)


Что касается того, что вы пытались (показывает вашу команду с расширенными псевдонимами):

Get-Content 1.txt | Sort-Object | Get-Unique

Ваши вызовы Sort-Object и Get-Unique работают на полных строках , что не является вашим намерением: поскольку все строки уникальны, если рассматривать в полном объеме , они все выход.

Обратите внимание, что Sort-Object имеет переключатель -Unique, поэтому следующее будет ближе к тому, что вы хотите, но это не позволит вам контролировать , который из строки с одним и тем же первым возвращаемым словом:

# !! INCORRECT, because you don't control which of the duplicates
# !! is returned, given that sorting is based on only the *first* word
# !! on each line.
PS> Get-Content 1.txt | Sort-Object { (-split $_)[0] } -Unique
a 1
b 1
...