Удалить не повторяющиеся строки в Linux

1918
qlwik

Как я могу удалить неповторяющиеся строки из текстового файла, используя любую программу linux linke sed, awk или любую другую?

Пример:

abc bbc abc bbc ccc bbc 

Результат:

abc bbc abc bbc bbc 

Второй список удалил ccc, потому что в нем не было повторяющихся строк.

Можно ли также удалить строки, которые не являются дубликатами AND, в которых есть только 2 дубликата, и оставить те, которые имеют более 2 дубликатов строк?

2
Важен ли порядок? Кроме того, все ли линии имеют одинаковую длину или какой шаблон они имеют? Julie Pelletier 7 лет назад 0
Линии имеют разную длину, порядок не важен. qlwik 7 лет назад 0

2 ответа на вопрос

5
MariusMatutiae

Решения, опубликованные другими, не работают на моем Debian Jessie: они хранят одну копию любой дублирующейся строки, в то время как я понимаю OP, что все копии дублирующихся строк должны храниться. Если я правильно понял ОП, то ...

  1. Следующая команда

    awk '!seen[$0]++' file 

    удаляет все повторяющиеся строки

  2. Следующая команда

    awk 'seen[$0]++' file 

    выводит все дубликаты, но не оригинальную копию: то есть, если строка появляется n раз, она выводит строку n-1 раз.

  3. Тогда команда

    awk 'seen[$0]++' file > temp && awk '!seen[$0]++' file >> temp 

    решает вашу проблему Строки не в исходном порядке.

  4. Если вы хотите, чтобы строки имели два или более дубликатов, теперь вы можете выполнить итерации выше:

    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 
  5. Если вам нужно сделать это для строк, которые появляются N или более раз, используйте следующую команду

     awk 'seen[$0]++ && seen[$0] > N' file 

    Проще чем цепочка N раз команда awk 'seen[$0]++' file.

3
UUU

Вы можете использовать sort& uniqкоманды для этого.

Если ваши данные в файле abc.txt, то;

cat abc.txt |sort|uniq -d 

Вне положено будет;

abc  bbc 

Похожие вопросы