所以我试图理解这个answer使用awk
合并两个文件,然后我想出了我的解决方案来满足我的要求。
awk 'FNR==NR{a[$1]=$2 FS $3;next} {a[$1]=$2 FS $3}{ print a[$1]}' file2 file1
我的文件如下: -
file1
和file2
内容如下: -
1 xyz pqr F -
1 abc def A -
1 abc mno G -
1 abc def A
1 xyz pqr T
我期待输出如下: -
1 xyz pqr F - T
1 abc def A - A
基本上匹配file2
上file1
的第1,2,3列,并打印在结果上附加file2
上最后一列的内容。
所以我对解决方案的理解如下,
FNR==NR{a[$1]=$2 FS $3;next}
将在file2
处理,将数组a
的条目存储为column2空格column3,直到file2
结束。file1
,我可以通过执行file2
来匹配{a[$1]=$2 FS $3}
中的这些行,这会在file1
列中为$1
列提供所有这些行值a[$1]
与column2值$2
空格column3值$3
相同。现在问题来了。$0
和a[$1]
并且他们正在给我按顺序输出,
1 xyz pqr F -
1 abc def A -
xyz pqr
abc def
分别。我最关心的是因为在file2
传递过程中我没有从FNR==NR
捕获最后一列,我可能没有将值存储在我的数组中?或者我存储了吗?
答案 0 :(得分:6)
使用此awk
:
awk 'NR==FNR{a[$2 FS $3]=$4; next} $2 FS $3 in a{print $0, a[$2 FS $3]}' file2 file1
您的awk
中存在一些问题。
$4
来自file2
。但是,你还没有存储它。file1
时,您将重新分配值为a
的数组file1
。 (这:a[$1]=$2 FS $3
)正如@EdMorton所建议的那样,一种更易读的形式:
awk '{k=$2 FS $3} NR==FNR{a[k]=$4; next} k in a{print $0, a[k]}' file2 file1