Linux: почему я не могу отобразить разные строки между этими двумя файлами?

#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 принудительного точного совпадения.