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

255
pnkjmndhl

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

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

0

2 ответа на вопрос

5
ace

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

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

sort file1 > file1_sorted sort file2 > file2_sorted diff file1_sorted file2_sorted 

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

diff <(sort file1) <(sort file2) 
2
Eric Renouf

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

I'd emphasize that `comm` needs **sorted** files. (Yes, you mention it indirectly, but it's easy to overlook the way you have phrased it). Also, `comm` is much more efficient for this scenario than `diff`. The `grep` solution can easily run out of memory if `file2` is large (exponential blowup when converting the NFA to a DFA), we had a question about this not long ago. dirkt 6 лет назад 0

Похожие вопросы