Как сделать разницу между линиями (diff) в Linux?

0

У меня есть два текстовых файла, где порядок строк не имеет значения. Я хочу выяснить, какие строки отличаются в одном файле от другого. Использование diff в linux находит разницу, но также учитывает изменения в строках одного и того же текста.

Другими словами, как мне сделать разницу без учета строки?

pnkjmndhl
источник

Ответы:

5

Если ваши файлы не слишком велики, вы можете использовать sortих перед diffзагрузкой.

Так что-то вроде этого будет работать:

sort file1 > file1_sorted
sort file2 > file2_sorted
diff file1_sorted file2_sorted

Или, как вы узнали в комментариях, вы также можете сделать это в одну строку,

diff <(sort file1) <(sort file2)
туз
источник
2

Подобно diffопциям, вы можете использовать commкоманду с подстановками процесса и sort( commтребует, чтобы файлы, с которыми он работает, были отсортированы). Это позволит вам сосредоточиться только на общих строках, только на строках в одном или другом -1файле, используя -2для подавления строк только в первом файле, для подавления строк только во втором файле или -3для подавления строк в обоих, так что увидеть все строки, которые есть только в первом файле, а не во втором, который вы могли бы сделать

comm -23 <(sort file1) <(sort file2)

конечно, если вы хотите, чтобы вы могли также рассмотреть возможность использования grepкак

grep -vFxf file2 file1

который будет обрабатывать строки в file2виде шаблонов и печатать только строки из файла file1, которые не имеют match ( -v) при обработке строк из ( -f) file2как фиксированных строк ( -F), которые должны соответствовать всей строке ( -x).

Преимущество grepрешения состоит в том, что нет необходимости сортировать файлы, но оно проверяет только строки в одном из файлов, которые не находятся в другом, а не в обоих направлениях одновременно.

Эрик Ренуф
источник
Подчеркну, что commнужны отсортированные файлы. (Да, вы упоминаете об этом косвенно, но легко не заметить, как вы это сформулировали). Кроме того, commгораздо эффективнее для этого сценария, чем diff. grepРешение может легко запустить из памяти , если file2велика (экспоненциальный раздутия при преобразовании НКА в ДКА), у нас был вопрос об этом не так давно.
Диркт