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


70

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

File1:

1 
2
3
3
3
4
4
4
5
6

Я хочу вывод:

3  
4

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


3
См man uniq.
Джейсонвриан

Связанный, более сложный вопрос: Удалить дубликаты попарно
Подстановочный

Ответы:


120

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

uniq -d file.txt

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.