найти разницу между двумя текстовыми файлами с одним элементом в строке [дубликат]
этот вопрос уже есть ответ здесь:
у меня есть два файла:
1dsf
sdfsd
dsfsdf
2
ljljlj
lkklk
dsf
sdfsd
dsfsdf
Я хочу отобразить то, что находится в файле 2, но не в файле 1, поэтому файл 3 должен выглядеть как
ljljlj
lkklk
11 ответов:
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.
Я успешно использовал
diff "${file1}" "${file2}" | grep "<" | sed 's/^<//g' > "${diff_file}"
вывод разницы в файл.
Если вы ожидаете их в определенном порядке, вы можете просто использовать
diff
diff file1 file2 | grep ">"
а попробовал небольшую вариацию на лукаответ, и это сработало для меня.
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..