#linux #bash #file #compare
#linux #баш #файл #Сравнить
Вопрос:
Я хочу сравнить два файла и отобразить строки, которые отличаются между этими двумя файлами. Я пробовал несколько способов сделать это, но я не могу этого сделать…
У меня есть этот первый файл :
frvmx0000423
ansible-test-relay-do-not-delete
frvmx0000434
frvmt0003036
frvmx0000661
rhel6918111243
frvmx0000416
frvmt0003040
mcds-test-303
jmt201
fb-demo5
frvmx0000635
cb003
rhel7511130951
rhel7511130956
vlpchh08
mcds-test-301
frvmx0000576
frvmx0000683
frvmx0000654
frvmx0000685
frvmx0000446
vlplin01
frvmx0000687
rhel69611917
frvmx0000622
rhel7511161022
vlpijl03
vlpedu03
И этот второй файл :
frvmx0000683
frvmx0000576
ansible-test-relay-do-not-delete
vlpedu03
frvmx0000687
frvmx0000685
frvmx0000654
frvmt0003299
mcds-test-301
cb003
mcds-test-303
FRVMT0003040
cb004
frvmx0000661
frvmt0003036
Я хочу, чтобы этот вывод представлял собой строки, которые отличаются между файлами :
frvmx0000423
frvmx0000434
rhel6918111243
frvmx0000416
jmt201
fb-demo5
frvmx0000635
rhel7511130951
rhel7511130956
vlpchh08
frvmx0000446
vlplin01
rhel69611917
frvmx0000622
rhel7511161022
vlpijl03
Но когда я пытаюсь использовать команду diff :
diff --suppress-common-lines file1 file2
Вывод :
1,15c1,29
< frvmx0000683
< frvmx0000576
< ansible-test-relay-do-not-delete
< vlpedu03
< frvmx0000687
< frvmx0000685
< frvmx0000654
< frvmt0003299
< mcds-test-301
< cb003
< mcds-test-303
< FRVMT0003040
< cb004
< frvmx0000661
< frvmt0003036
---
> frvmx0000423
> ansible-test-relay-do-not-delete
> frvmx0000434
> frvmt0003036
> frvmx0000661
> rhel6918111243
> frvmx0000416
> frvmt0003040
> mcds-test-303
> jmt201
> fb-demo5
> frvmx0000635
> cb003
> rhel7511130951
> rhel7511130956
> vlpchh08
> mcds-test-301
> frvmx0000576
> frvmx0000683
> frvmx0000654
> frvmx0000685
> frvmx0000446
> vlplin01
> frvmx0000687
> rhel69611917
> frvmx0000622
> rhel7511161022
> vlpijl03
> vlpedu03
Если я попытаюсь с sort
помощью и uniq
:
cat postman_list vcenter_list | sort | uniq -u
Вывод :
FRVMT0003040
ansible-test-relay-do-not-delete
ansible-test-relay-do-not-delete
cb003
cb003
cb004
fb-demo5
frvmt0003036
frvmt0003036
frvmt0003040
frvmt0003299
frvmx0000416
frvmx0000423
frvmx0000434
frvmx0000446
frvmx0000576
frvmx0000576
frvmx0000622
frvmx0000635
frvmx0000654
frvmx0000654
frvmx0000661
frvmx0000661
frvmx0000683
frvmx0000683
frvmx0000685
frvmx0000685
frvmx0000687
frvmx0000687
jmt201
mcds-test-301
mcds-test-301
mcds-test-303
mcds-test-303
rhel6918111243
rhel69611917
rhel7511130951
rhel7511130956
rhel7511161022
vlpchh08
vlpedu03
vlpedu03
vlpijl03
vlplin01
Кто — нибудь , кто покажет мне , как это сделать ?
Ответ №1:
Я немного смущен вашим определением lines that are differents between the files
, потому что показанный ожидаемый результат выглядит так lines unique to file1
. Если да, пожалуйста, попробуйте:
comm -2 -3 <(sort file1) <(sort file2)
Выходной сигнал:
fb-demo5
frvmt0003040
frvmx0000416
frvmx0000423
frvmx0000434
frvmx0000446
frvmx0000622
frvmx0000635
jmt201
rhel6918111243
rhel69611917
rhel7511130951
rhel7511130956
rhel7511161022
vlpchh08
vlpijl03
vlplin01
Вместо этого, если вы хотите напечатать обе «строки, уникальные для file1» и
«строки, уникальные для file2», которые будут общепринятой интерпретацией
different lines
, пожалуйста, попробуйте:
comm -3 --output-delimiter= <(sort file1) <(sort file2)
Выходной сигнал:
FRVMT0003040
cb004
fb-demo5
frvmt0003040
frvmt0003299
frvmx0000416
frvmx0000423
frvmx0000434
frvmx0000446
frvmx0000622
frvmx0000635
jmt201
rhel6918111243
rhel69611917
rhel7511130951
rhel7511130956
rhel7511161022
vlpchh08
vlpijl03
vlplin01
Ответ №2:
Используйте grep с -f (список шаблонов из файла) и -v (обратное совпадение)
grep -v -f file2 file1
Комментарии:
1. Простой и приятный ответ. Это хорошо работает с приведенными примерами. Но у этого может быть потенциальная проблема: если файл1 содержит строку, например
cb0030
, он совпадает со строкойcb003
в файле 2 из-за характераgrep
, и они рассматриваются какcommon
строки. Будет лучше добавить-x
опцию дляgrep
принудительного точного совпадения.