我知道已经发布了类似的问题但我仍然在使用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)的值。
提前致谢。
答案 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
重申:此解决方案需要文件之间一一对应