匹配两个文件中的列

匹配两个文件中的列

我有两个文件。 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,然后,如果$3file1 与数组中的索引匹配,则追加 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

相关内容