Чтобы найти повторяющиеся совпадения с помощью `uniq -d`

Мои данные как /tmp/1

9367543
9105616
9108177
8948074
8860323
9170406
9105616

Я бегу и ничего не получаю

cat /tmp/1 | uniq -d

Это странно, так как uniq -d должен

-d      Only output lines that are repeated in the input.

Как вы можете использовать uniq -d?


person Léo Léopold Hertz 준영    schedule 25.07.2009    source источник


Ответы (3)


Вы должны отсортировать свои данные, прежде чем использовать uniq. Он удаляет/обнаруживает дубликаты только в соседних строках.

person dave    schedule 25.07.2009
comment
Или использовать скрипт awk для правильной работы? - person Douglas Leeder; 25.07.2009
comment
Спасибо, что указали на это! --- Даже в инструкции написано The uniq utility reads the specified input_file comparing adjacent lines - -. - person Léo Léopold Hertz 준영; 25.07.2009
comment
С моим GNU coreutils uniq в руководстве говорится: Отбросить все, кроме одной, последовательные идентичные строки из INPUT (или стандартного ввода), записывая в OUTPUT (или стандартный вывод). - person Sean A.O. Harney; 25.07.2009

Попробуйте это, чтобы перепроверить, он выведет все повторяющиеся строки:

  cat /tmp/1 |  awk 'seen[$0]++ == 1'

О, это твоя проблема:

 cat /tmp/1 | sort | uniq -d

Отсортируйте его перед запуском uniq!

person Sean A.O. Harney    schedule 25.07.2009
comment
Строки 2 и 7 примера файла Маси одинаковы. Но они не на последовательных строках, что, по-видимому, и является причиной недоразумения. - person dave; 25.07.2009
comment
Ghostdog, ну, я использую кошку, потому что ОП тоже. Да, я знаю, что вместо этого я мог бы использовать перенаправление оболочки или указать аргумент командной строки для awk или sort. Дэйв, спасибо. Не видел такого! отредактировано. - person Sean A.O. Harney; 25.07.2009

awk '{_[$0]++}END{for(i in _)if(_[i]>1) print i}' /tmp/1

или просто

awk '_[$0]++ == 1' file
person ghostdog74    schedule 25.07.2009
comment
awk '_[$0]++' работает, только если есть не более одного дубликата для каждой строки с дубликатами. Если бы у вас было три одинаковых строки, они были бы напечатаны дважды. - person Sean A.O. Harney; 25.07.2009