Сравнить содержимое двух файлов по горизонтали и вертикали

Сравнить содержимое двух файлов по горизонтали и вертикали

У меня есть два файла:

Файл 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

Связанный контент