Как распечатать только дубликаты значений из текстового файла?

70

Предположим, что есть столбец числовых значений, например:

File1:

1 
2
3
3
3
4
4
4
5
6

Я хочу вывод:

3  
4

То есть только повторные строки. Есть ли инструменты командной строки, чтобы узнать это в Linux? (Примечание: значения отсортированы по номерам).

Mindfreak
источник
3
См man uniq.
Джейсонвриан
Связанный, более сложный вопрос: Удалить дубликаты попарно
Подстановочный

Ответы:

120

Вы можете использовать uniq(1)для этого:

uniq -d file.txt

Это распечатает только дубликаты. Входной файл должен быть отсортирован так, чтобы все дубликаты были последовательными (что они кажутся), поэтому сначала выполните его сортировку, если это не так.

CAMH
источник
1
Что делать, если я хочу, чтобы тройки были напечатаны?
MiNdFrEaK
8
@MiNdFrEaK sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'для трех экземпляров; замените «3» на любой N для N-складок
full.stack.ex
@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'для трех экземпляров
@camh ты можешь сделать это и в CSV-файлах? только значения определенного столбца?
NumenorForLife
1
сортировать file.txt | uniq -d
ron
1

Использование uniqи awk:

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'
Рикардо Рейес
источник
6
Это работает, но я не понимаю, почему вы передаете вывод cat?
Бернхард
1
Не все знают, что вы можете сделать, uniq -c File1и так же, как многие другие инструменты. Это, вероятно, то, что здесь происходит.
Матиас
1

Выполните это: perl -ne 'print if $a{$_}++' filename.txt

Санджай Наир
источник
Это дает 3\n3\n4\n\4nдля входа File1, который, очевидно, неправильно.
yaegashi
фрагмент perl, который я повторяю, предоставляет количество инцидентов в каждой строке, чтобы их можно было пересылать, сортировать и фильтровать по мере необходимости: perl -ne '$ a {$ _} ++; END {while (($ k, $ v) = каждый% a) {printf "% d \ t% s", $ v, $ k}} 'имя файла
Theophrastus
Есть ли способ сделать это в определенном столбце, отделенном заданным разделителем полей?
Геремия,
Как указывает yaegashi, для выполнения требований требуется небольшое исправление: perl -ne 'print if 1 == $ a {$ _} ++' filename.txt Среди всех ответов это мой любимый, потому что остальные ответы требуют предварительной обработки всех данных с полной сортировкой. Этот ответ запускает вывод результатов быстрее и эффективнее.
BOC
0

uniq требует, чтобы ваш список был упорядочен, сортировка по умолчанию в алфавитном порядке

sort | uniq -d path/to/your/filename

или же

cat fileName | sort | uniq -d path/to/your/filename

jasonleonhard
источник