3つのファイルがあります。
file1 には次のデータがあります。
A,B,C,D,E,F,G
1,2,3,4,5,6,7
7,6,5,4,3,2,1
file2 には次のデータがあります。
A,B,C,D,E,F,G
1,2,3,4,5,5,7
7,6,6,4,3,2,1
file3 には A というフィールドが 1 つしかありません。
A
1
2
7
ここで、file3で使用できる列Aのfile1とfile2を比較したいと思います。
列ヘッダーと列数は両方のファイルで同じです。
希望の出力
Item FILE1 FILE2
1 F=6 F=5
7 C=5 C=6
より多くの列が一致しない場合
A,B,C,D,E,F,G
1,2,3,4,5,5,7
7,6,5,2,3,2,1
A,B,C,D,E,F,G
1,2,3,1,4,6,7
7,6,6,4,3,2,1
その後、出力は次のようになります
Item FILE1 FILE2
1 D=4 D=1
E=5 E=4
F=5 F=6
7 C=5 C=6
D=2 D=4
これは例です。列数は変更できますが、File1とFile2では常に同じです。したがって、以前の質問とは異なります。
答え1
#!/bin/bash
join -t, file_1 file_2 | join -t, - file_3 |
awk -F, '
NR == 1 {
fields_num = (NF + 1) / 2
for(i = 1; i <= fields_num; i++)
field_names[i] = $i
}
NR != 1 {
item = $1 "\t"
for(i = 2; i <= fields_num; i++) {
cmp_num = i + fields_num - 1
if($i != $cmp_num) {
printf "%s%s=%s\t%s=%s\n",
item,
field_names[i], $i,
field_names[i], $cmp_num
item = "\t"
}
}
}'
いくつかの仮定をしました。
- 比較に使用される列は常に最初です。
- すべてのファイルは、
A
最初の列(フィールド)に基づいてソートされます。 file_1
2つのファイル(and)に表示される項目のみを比較してください。file_2
したがって、file_1
項目がありますが、存在しない場合、2
そのfile_2
行は比較から除外されます。
入力する
tail -n +1 -- file_*
==> file_1 <==
A,B,C,D,E,F,G
1,2,3,4,5,5,7
7,6,5,2,3,2,1
==> file_2 <==
A,B,C,D,E,F,G
1,2,3,1,4,6,7
7,6,6,4,3,2,1
==> file_3 <==
A
1
2
7
出力
1 D=4 D=1
E=5 E=4
F=5 F=6
7 C=5 C=6
D=2 D=4