2009-07-25 2 views
2

Мои данные как/TMP/1Чтобы найти повторяющиеся спички `Uniq -d`

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?

+0

Спасибо за ваши ответы! –

ответ

6

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

+0

Или используйте awk-скрипт для правильной работы? –

+0

Спасибо, что указали это! --- Он даже говорит в руководстве 'Утилита uniq читает указанный входной файл, сравнивающий смежные строки - -.' –

+0

С моим GNU coreutils uniq в руководстве написано: Отбросить все, кроме одной из последовательных одинаковых строк от INPUT (или стандартного ввод), запись в OUTPUT (или стандартный вывод). –

1

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

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

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

cat /tmp/1 | sort | uniq -d 

Сортировать его перед запуском Uniq!

+2

не нужно использовать кошку. – ghostdog74

+0

Строки 2 и 7 файла примера Маси - то же самое. Но они не являются последовательными линиями, которые, по-видимому, являются сердцем недоразумений. – dave

+0

ghostdog, ну, я использую кошку, потому что OP тоже. Да, я знаю, что вместо этого я мог бы использовать перенаправление оболочки или давать в командной строке arg awk или sort. dave, спасибо. Не видел этого! изм. –

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

или просто

awk '_[$0]++ == 1' file 
+0

awk '_ [$ 0] ++' работает только в том случае, если для каждой строки с дубликатами имеется не более одного дубликата. Если бы у вас было три строки, которые были бы одинаковыми, он дважды печатался. –

Смежные вопросы