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

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

2 ответа2

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, которые не имеют совпадений (-v), при обработке строк из (-f) file2 как фиксированных строк (-F), которые должны соответствовать всей строке (-x).

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

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