Удалить не повторяющиеся строки в 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чтобы удалить начальные номера строк.