使用awk连接匹配列值的2个文件

时间:2015-02-12 19:21:19

标签: join awk

我知道已经发布了类似的问题但我仍然在使用awk FNR == NR获得我想要的输出时遇到一些麻烦... 我有2个文件

File 1: 
123|this|is|good
456|this|is|better
...

File 2:
aaa|123
bbb|456
...

所以我想加入从文件2 / column2到文件1 / column1和输出文件1(col 2,3,4)和文件2(col 1)的值。

提前致谢。

2 个答案:

答案 0 :(得分:3)

使用awk,您可以执行类似

的操作
awk -F \| 'BEGIN { OFS = FS } NR == FNR { val[$2] = $1; next } $1 in val { $(NF + 1) = val[$1]; print }' file2 file1

NF是记录中的字段数(默认为行),因此$NF是最后一个字段,$(NF + 1)是之后的字段。通过将file2的传递中保存的值分配给它,在打印之前会将新字段附加到记录中。

需要注意的一点是:它的行为类似于内连接,即只打印其键出现在两个文件中的记录。要使其成为正确的联接,您可以使用

awk -F \| 'BEGIN { OFS = FS } NR == FNR { val[$2] = $1; next } { $(NF + 1) = val[$1]; print }' file2 file1

也就是说,您可以在附加和打印操作上删除$1 in val条件。如果$1不在val中,则val[$1]为空,并且在打印前会将空字段附加到记录中。

但使用join可能更好:

join -1 1 -2 2 -t \| file1 file2

如果您不希望关键字段成为输出的一部分,请通过cut -d \| -f 2-管理其中任何一个命令的输出以清除它,即

join -1 1 -2 2 -t \| file1 file2 | cut -d \| -f 2-

答案 1 :(得分:1)

如果文件的行数相同,那么

paste -d '|' file1 file2 | cut -d '|' -f 2-5
this|is|good|aaa
this|is|better|bbb

我在对Wintermute的回答中看到文件没有排序。使用bash,流程替换可以随时进行排序:

paste -d '|' <(sort -t '|' -k 1,1 file1) <(sort -t '|' -k 2,2 file2) |
cut -d '|' -f 2-5

重申:此解决方案需要文件之间一一对应