我有两个文件。 file1 中的一些名称也在 file2 中。如何在第一个文件的 $3 和第二个文件的 $2 之间匹配后将第二个文件的 $3 和 $4 列分配给第一个文件?非常感谢。
file1.dat
1 2.5 S1 2.5
1 54 S2 2.5
2 465 S3 1.4
2 65 D 4.2
3 465 P 4.2
3 897 L 4.2
4 12 H_L 4.2
4 46 H_M 4.2
file2.dat
1 S1 2.55 4
2 S2 2.56 6
3 S3 1.44 8
4 D 4.22 7
5 H_L 4.2 6
6 H_M 4.2 65
期望的输出:
1 2.5 S1 2.5 2.55 4
1 54 S2 2.5 2.56 6
2 465 S3 1.4 1.44 8
2 65 D 4.2 4.22 7
3 465 P 4.2 - -
3 897 L 4.2 - -
4 12 H_L 4.2 4.2 6
4 46 H_M 4.2 4.2 65
答案1
这个问题在这里已经解决了无数次了。怎么样
awk 'NR==FNR {Tmp[$2] = $3 FS $4; next} ($3 in Tmp) {print $0 FS Tmp[$3]}' file2 file1
1 2.5 S1 2.5 2.55 4
1 54 S2 2.5 2.56 6
2 465 S3 1.4 1.44 8
2 65 D 4.2 4.22 7
4 12 H_L 4.2 4.2 6
4 46 H_M 4.2 4.2 65
将 file2 的所需字段读取到索引为 的数组中$2
,然后,如果$3
file1 与数组中的索引匹配,则追加 resp。元素到$0
,并打印。
对于两条不匹配的行,请尝试例如
awk 'NR==FNR {Tmp[$2] = $3 FS $4; next} ($3 in Tmp) {print $0 FS Tmp[$3]; next} {print $0, "- -"}' file2 file1
1 2.5 S1 2.5 2.55 4
1 54 S2 2.5 2.56 6
2 465 S3 1.4 1.44 8
2 65 D 4.2 4.22 7
3 465 P 4.2 - -
3 897 L 4.2 - -
4 12 H_L 4.2 4.2 6
4 46 H_M 4.2 4.2 65