Как сделать uniq -d без предварительной сортировки (или чего-то подобного)

Я знаю, что могу удалить повторяющиеся строки без предварительной сортировки, например:

awk '!x[$0]++' file

Однако моя цель - печатать только повторяющиеся строки и только один раз. Если бы не проблема предварительной сортировки

sort | uniq -d

было бы идеально. НО порядок имеет для меня большое значение. Есть ли способ сделать это с помощью awk, grep или чего-то подобного?

Я ищу один вкладыш, который не требует написания сценария, если это возможно.


person badner    schedule 05.07.2016    source источник
comment
Вы утверждаете, что sort | uniq -d не сохраняет порядок? Мне подходит (GNU coreutils) 8.4   -  person Inian    schedule 05.07.2016
comment
@Inian Я думаю, он имел в виду, что использовал бы uniq -d, если бы ему не нужно было сначала сортировать его ..   -  person lewiatan    schedule 05.07.2016
comment
@lewiatan точно!   -  person badner    schedule 05.07.2016


Ответы (2)


Просто проверьте значение x[$0]:

awk 'x[$0]++ == 1' file.txt

Приведенное выше напечатает строку, когда ее увидят во второй раз.

Или с префиксом ++:

awk '++x[$0] == 2' file.txt
person andlrc    schedule 05.07.2016

Попробуйте просто удалить ! из команды awk.

bash-4.1$ cat /tmp/inp.txt 
abc
def
abc
xyz
def
hello

bash-4.1$ awk 'x[$0]++ == 1' /tmp/inp.txt 
abc
def

Надеюсь, это то, что вы ожидаете!!

person Fazlin    schedule 05.07.2016