2016-10-21 4 views
3

Как удалить строки, появляющиеся только один раз в файле в bash?Как удалить строки появляются только один раз в файле с помощью bash

Например, файл foo.txt имеет:

1 
2 
3 
3 
4 
5 

после обработки файла, только

3 
3 

останется.

Отметьте, что файл уже разобран.

+0

Если числа '1,3,1,3' являются порядком вывода или вы можете обрабатывать' 1,1,3,3, '? –

+1

@James Brown файл уже отсортирован. – user200340

ответ

6

Если дублированные линии consecutives, вы можете использовать uniq

uniq -D file 

от человека страниц:

-D печатать все повторяющиеся строки

+2

, если дублированные строки не являются последовательными, вы должны сначала их отсортировать 'sort file | uniq -D' –

+2

Обратите внимание, что '-D' является расширением _GNU и не будет работать с BSD/macOS' uniq'. – mklement0

3

Просто петля файл дважды:

$ awk 'FNR==NR {seen[$0]++; next} seen[$0]>1' file file 
3 
3 
  • во-первых, чтобы подсчитать, сколько раз встречается строка: seen[ record ] отслеживает его как массив.
  • во-вторых, чтобы напечатать те, которые появляются несколько раз
+1

Этот ответ сохранит исходный порядок, и он будет работать, даже если входные данные несортированы ++ – anubhava

2

Использование одного прохода AWK:

awk '{freq[$0]++} END{for(i in freq) for (j=1; freq[i]>1 && j<=freq[i]; j++) print i}' file 

3 
3 
  • Использование freq[$0]++ мы рассчитываем и хранить частоту каждой строки.
  • В блоке END, если frequency больше, чем 1, тогда мы печатаем эти строки столько раз, сколько частота.
+1

приятно! Мне нравится ваш гуру '' for-loop' (http://stackoverflow.com/a/40110515/1983854) – fedorqui

2

Использование AWK, один проход:

$ awk 'a[$0]++ && a[$0]==2 {print} a[$0]>1' foo.txt 
3 
3 

Если файл неупорядочен, вывод будет происходить в дубликатах порядка, которые будут найдены в файле из-за отсутствия значений буферизации.

1

Вот POSIX-совместимых awk альтернатива GNU специфичной uniq -D:

awk '++seen[$0] == 2; seen[$0] >= 2' file 

Это оказалось просто короче переформулировкой James Brown's helpful answer.

В отличие от uniq, эта команда не строго требуют дубликатами быть сгруппированы, но порядок вывода будет только предсказуемы, если они есть.

То есть, если дубликаты не группируются, порядок вывода определяется относительной упорядоченности 2- экземпляров в каждом наборе дублей, и в каждом наборе 1-й и 2-й экземпляры будут напечатаны вместе.

Для несортированный (разгруппировать) данные (и если сохранение порядка ввода также важно), рассмотреть следующие вопросы:

+0

Короче, я буду пить. –

+1

@JamesBrown: Спасибо - я фактически не заметил (и не проголосовал) за ваш ответ, пока не написал свой. – mklement0

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