comm -23 не удаляет все общие строки - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу удалить строки из файла 1.txt, которые находятся в файле 2.txt, и сохранить вывод в 3.txt, я использую эту команду bash:

comm -23 1.txt 2.txt > 3.txt

Когда я проверяю выводв файле 3.txt я нахожу, что некоторые общие строки между 1.txt и 2.txt все еще находятся в 3.txt, возьмем в качестве примера слово «registry», в чем проблема?

Вы можетезагрузите два файла ниже:

файл 1.txt: https://ufile.io/n7vn6

файл 2.txt: https://ufile.io/p4s58

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Я не уверен, как вы сгенерировали свои текстовые файлы, но проблема в том, что некоторые из ваших строк 1.txt и 2.txt не имеют согласованных окончаний строк.У некоторых есть символ CR (ctrl-M), но нет единственной строки, которую Linux ожидает для текстовых файлов.Например, один из них имеет registry^M, который не соответствует registry (программы Linux, которые проверяют текст, будут видеть ^M как другой символ или пробел, но не как завершение строки, которое игнорируется).Когда вы смотрите на файл в некоторых текстовых редакторах, ^M не отображается, поэтому кажется, что registry одинаково в обоих местах, но это не так.

Вы можете попробовать:

dos2unix 1.txt 2.txt
comm -23 <(sort 1.txt) <(sort 2.txt) > 3.txt

dos2unix сделает все окончания строки правильными (при условии, что они могут использовать DOS CR).Обратите внимание, что это может немного повлиять на сортировку, поэтому я тоже прибегаю к ним.Вы можете попробовать это, не прибегая к помощи, и если есть проблема, comm выдаст ошибку, что один из файлов не отсортирован.

0 голосов
/ 22 ноября 2018

comm необходимо отсортировать ввод.Вы можете использовать процесс подстановки для этого:

comm -23 <(sort 1.txt) <(sort 2.txt) > 3.txt

Обновить, если у вас дополнительно возникла проблема с окончанием строки, вы можете использовать sed для выравнивания:

comm -23 <(sed 's/\r//g' 1.txt | sort) <(sed 's/\r//g' 2.txt| sort) > 3.txt
...