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