![合并两个文件的内容并比较列的内容](https://linux22.com/image/27886/%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E5%86%85%E5%AE%B9%E5%B9%B6%E6%AF%94%E8%BE%83%E5%88%97%E7%9A%84%E5%86%85%E5%AE%B9.png)
我在尝试合并两个文件的内容时遇到问题:
文件1:
873 1.1.1.1
1033 99.99.99.10
1108 78.2.204.174
1257 78.2.8.181
文件2:
test1 78.2.8.181 p6
test2 99.99.99.10 p9
test7 1.1.1.1 p10
test8 78.2.204.174 p4
我想将两个文件合并为一个文件,如下所示,考虑到共享列是第二个,并且必须对其进行比较以适合有问题的行:
873 1.1.1.1 test7 p10
1033 99.99.99.10 test2 p9
1108 78.2.204.174 test8 p4
1257 78.2.8.181 test1 p6
我尝试过一些使用awk
但没有成功的事情。
答案1
您可以用于join
此目的。
首先,我们必须使用第二列作为键对两个文件进行排序:
$ sort -t' ' -k 2,2 a > as
$ sort -t' ' -k 2,2 b > bs
导致:
$ cat as
873 1.1.1.1
1108 78.2.204.174
1257 78.2.8.181
1033 99.99.99.10
$ cat bs
test7 1.1.1.1 p10
test8 78.2.204.174 p4
test1 78.2.8.181 p6
test2 99.99.99.10 p9
然后实际加入:
$ join -t' ' -j2 as bs
1.1.1.1 873 test7 p10
78.2.204.174 1108 test8 p4
78.2.8.181 1257 test1 p6
99.99.99.10 1033 test2 p9
答案2
join -j2 <(sort -k2 file1) <(sort -k2 file2) -o 1.1,1.2,2.1,2.3 | column -t
输出
873 1.1.1.1 test7 p10
1108 78.2.204.174 test8 p4
1257 78.2.8.181 test1 p6
1033 99.99.99.10 test2 p9
答案3
使用 awk 的一种方法:
$ awk 'NR==FNR{a[$2]=$1 FS $3;next}{print $0 FS a[$2] }' file2 file1
873 1.1.1.1 test7 p10
1033 99.99.99.10 test2 p9
1108 78.2.204.174 test8 p4
1257 78.2.8.181 test1 p6
文件 f2 被加载到一个数组中,其中第二个字段是索引,数组的值是 file2 的第三个和第四个字段的组合。处理 file1 时,将打印整行以及数组中存储的值。