Удалить не повторяющиеся строки в Linux
Как я могу удалить не дублирующиеся строки из текстового файла, используя любую программу linux linke sed, awk или любую другую?
Пример:
abc
bbc
abc
bbc
ccc
bbc
Результат:
abc
bbc
abc
bbc
bbc
Второй список удалил ccc, потому что в нем не было повторяющихся строк.
Можно ли также удалить строки, которые не являются дубликатами AND, в которых есть только 2 дубликата, и оставить те, которые имеют более 2 дубликатов строк?
3 ответа
Решения, опубликованные другими, не работают на моем Debian Jessie: они хранят одну копию любой дублирующейся строки, в то время как я понимаю OP, что все копии дублирующих строк должны храниться. Если я правильно понял ОП, то...
Следующая команда
awk '!seen[$0]++' file
удаляет все повторяющиеся строки
Следующая команда
awk 'seen[$0]++' file
выводит все дубликаты, но не оригинальную копию: то есть, если строка появляется n раз, она выводит строку n-1 раз.
Тогда команда
awk 'seen[$0]++' file > temp && awk '!seen[$0]++' file >> temp
решает вашу проблему Строки не в исходном порядке.
Если вы хотите, чтобы строки имели два или более дубликатов, теперь вы можете выполнить итерации выше:
awk 'seen[$0]++' file | awk 'seen[$0]++' > temp
хранит n-2 копии строк, которые имеют n>1 дубликатов. Сейчас
awk '!seen[$0]++' temp > temp1
удаляет все дублирующиеся строки из временного файла, и теперь вы можете получить то, что вы хотите (т.е. только строки с n>1 дубликатами), следующим образом:
cat temp1 >> temp; cat temp1 >> temp
Если вам нужно сделать это для строк, которые появляются N или более раз, используйте следующую команду
awk 'seen[$0]++ && seen[$0] > N' file
Проще чем цепочка N раз команда
awk 'seen[$0]++' file
,
Ты можешь использовать sort
& uniq
Команды для этого.
Если ваши данные в файле abc.txt, то;
cat abc.txt |sort|uniq -d
Выход положен будет;
abc
bbc
Ответ @UUU не сохраняет порядок сортировки. Чтобы сохранить порядок сортировки, используйте вместо этого следующее:
printf '%s\n' abc bbc abc bbc ccc bbc | \
nl -nrz | \
sort -k2 | \
uniq -f1 -D | \
sort | \
cut -f2
- The
printf
команда просто воспроизводит ввод. -
nl
команда добавляет номера строк с ведущими нулями, чтобы можно было обойтись без-V
флаг. - команда сортирует по второму полю. По умолчанию поля разделяются пробелами.
-
uniq
команда идентифицирует уникальные соседние строки (поэтому сначала нужно выполнить сортировку) и-f1
пропускает первое поле, которое является номером строки. -
sort
еще раз, чтобы восстановить первоначальный порядок. -
cut
чтобы удалить начальные номера строк.