我有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:
A
1
2
7
现在我想比较 A 列上的文件 1 和文件 2,该列在文件 3 中可用。
两个文件中的列标题和列数相同。
所需输出
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
这是示例,列数可能有所不同,但在文件 1 和文件 2 中始终相同。因此,它与之前的问题不同。
答案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
和)中出现的那些项目。file_2
因此,如果file_1
拥有该 item2
,但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