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


этот вопрос уже есть ответ здесь:

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

1
dsf
sdfsd
dsfsdf
2
ljljlj 
lkklk 
dsf
sdfsd
dsfsdf

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

ljljlj 
lkklk 
11 61

11 ответов:

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

grep -f file1 file2

или

grep -v -F -x -f file1 file2
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.

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

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

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

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

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

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

diff file1 file2 | grep ">"

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

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

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

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

file1 
m1
m2
m3

file2 
m2
m4
m5

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

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

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

Если вы хотите использовать циклы, вы можете попробовать так: (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..

ответ awk:

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

С 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 скрипт по второму sed.