Решения, опубликованные другими, не работают на моем 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
.