使用awk

时间:2016-06-14 11:34:28

标签: bash shell awk

所以我试图理解这个answer使用awk合并两个文件,然后我想出了我的解决方案来满足我的要求。

awk 'FNR==NR{a[$1]=$2 FS $3;next} {a[$1]=$2 FS $3}{ print a[$1]}' file2 file1

我的文件如下: -

file1file2内容如下: -

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

基本上匹配file2file1的第1,2,3列,并打印在结果上附加file2上最后一列的内容。

所以我对解决方案的理解如下,

  1. FNR==NR{a[$1]=$2 FS $3;next}将在file2处理,将数组a的条目存储为column2空格column3,直到file2结束。
  2. 现在file1,我可以通过执行file2来匹配{a[$1]=$2 FS $3}中的这些行,这会在file1列中为$1列提供所有这些行值a[$1]与column2值$2空格column3值$3相同。现在问题来了。
  3. 在file1中匹配后,我不知道如何按预期打印值。我尝试打印$0a[$1]并且他们正在给我
  4. 按顺序输出,

    1 xyz pqr F -
    1 abc def A -
    
    xyz pqr
    abc def
    

    分别。我最关心的是因为在file2传递过程中我没有从FNR==NR捕获最后一列,我可能没有将值存储在我的数组中?或者我存储了吗?

1 个答案:

答案 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