
У меня есть два файла:
Файл File1 имеет следующее содержимое:
1 2 3 4 5 6 7 8 10
Файл File2 имеет следующее содержимое:
1
2
3
4
5
6
7
8
9
10
Как найти разницу между двумя файлами и вывести нечетное число, а также сказать, из какого файла оно?
Например, в этом случае 9
появляется только в File2, так как же мне выполнить команду и получить вывод в виде строк
9 is only in File2
решение1
Если у вас чистое форматирование (пробел x новая строка), проще всего преобразовать строку в строки и просто сравнить их, например так:
diff <( sed -e "s/ /\n/g" h.txt ) v.txt
Где h.txt
горизонтальный файл и v.txt
вертикальный файл
решение2
Возможно, вам захочется использовать (G)AWK:
Чтобы найти различия, сначала преобразуйте file1.txt в построчное представление с помощью AWK, а затем передайте результат в diff:
gawk 'BEGIN {FS = " "} ; {for(i=1; i<=NF; i++) print $i}' file1.txt | diff file2.txt -
решение3
Есть несколько способов сделать это. Вот comm
.
Сначала printf
заголовок для интерпретации comm
вывода — предоставление запрошенных имен файлов — затем запуск comm
отсортированного ввода, подавление строк, которые существуют в обоих файлах ( -3
). Два ввода для comm
— это подстановки процесса, где я использую предложение don_crissti tr
для преобразования пробелов в File1
символы новой строки; затем пропускаю оба файла через sort
, что comm
требует.
printf "File1\tFile2\n"; comm -3 <(tr ' ' '\n' < File1 | sort) <(sort File2)
Образец запуска
Входной файл1:
1 2 3 4 5 6 7 8 10 11
Входной файл2:
1
2
3
4
5
6
7
8
9
10
Выход:
$ printf "File1\tFile2\n"; comm -3 <(sed 's/ /\n/g' File1 |sort ) <(sort File2)
File1 File2
11
9