Как сделать разницу, нечувствительную к строкам (diff) в Linux?

Как сделать разницу, нечувствительную к строкам (diff) в Linux?

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

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

решение1

Если ваши файлы не слишком большие, вы можете 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решения в том, что не нужно сортировать файлы, но оно проверяет только строки в одном из файлов, которых нет в другом, а не в обоих направлениях одновременно.

Связанный контент