%20%D0%B2%20Linux%3F.png)
У меня есть два текстовых файла, в которых порядок строк не имеет значения. Я хочу найти строки, которые отличаются в одном файле от другого. Использование 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
решения в том, что не нужно сортировать файлы, но оно проверяет только строки в одном из файлов, которых нет в другом, а не в обоих направлениях одновременно.