Подтвердить что ты не робот

Найти разницу между двумя текстовыми файлами с одним элементом на строку

У меня есть два файла:

файл 1

dsf
sdfsd
dsfsdf

файл 2

ljljlj 
lkklk 
dsf
sdfsd
dsfsdf

Я хочу отобразить то, что находится в файле 2, но не в файле 1, поэтому файл 3 должен выглядеть как

ljljlj 
lkklk 
4b9b3361

Ответ 1

Вы можете попробовать

grep -f file1 file2

или

grep -v -F -x -f file1 file2

Ответ 2

grep -Fxvf file1 file2

Что означают флаги:

-F, --fixed-strings
              Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.    
-x, --line-regexp
              Select only those matches that exactly match the whole line.
-v, --invert-match
              Invert the sense of matching, to select non-matching lines.
-f FILE, --file=FILE
              Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.

Ответ 3

Вы можете использовать команду comm для сравнения двух отсортированных файлов

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

Ответ 4

Я успешно использовал

diff "${file1}" "${file2}" | grep "<" | sed 's/^<//g' > "${diff_file}"

Вывод разницы в файл.

Ответ 5

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

diff file1 file2 | grep ">"

Ответ 6

join -v 2 <(sort file1) <(sort file2)

Ответ 7

A попробовал небольшое отклонение от ответа Luca, и это сработало для меня.

diff file1 file2 | grep ">" | sed 's/^> //g' > diff_file

Обратите внимание, что искомый шаблон в sed является >, за которым следует пробел.

Ответ 8

file1 
m1
m2
m3

file2 
m2
m4
m5

>awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2
m4
m5

>awk 'NR == FNR {file1[$0]++; next} ($0 in file1)' file1 file2
m2

> What awk command to get 'm1 and m3' ??  as in file1 and not in file2? 
m1
m3

Ответ 9

Если вы хотите использовать циклы, вы можете попробовать следующее: (diff и cmp намного эффективнее.)

while read line
do
    flag = 0
    while read line2
    do
       if ( "$line" = "$line2" )
        then
            flag = 1
        fi
     done < file1 
     if ( flag -eq 0 )
     then
         echo $line > file3
     fi
done < file2

Примечание. Программа предназначена только для того, чтобы дать общее представление о том, что можно сделать, если вы не хотите использовать системные вызовы, такие как diff n comm..

Ответ 10

ответ awk:

awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2

Ответ 11

С GNU sed:

sed 's#[^^]#[&]#g;s#\^#\\^#g;s#^#/^#;s#$#$/d#' file1 | sed -f- file2

Как это работает:

Первый sed создает такой вывод:

/^[d][s][f]$/d
/^[s][d][f][s][d]$/d
/^[d][s][f][s][d][f]$/d

Затем он используется как sed script вторым sed.