2

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

Пример:

abc
bbc
abc
bbc
ccc
bbc

Результат:

abc
bbc
abc
bbc
bbc

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

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

2 ответа2

5

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

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

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

cat abc.txt |sort|uniq -d

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

abc 
bbc

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .