2016-06-14 54 views
3

所以我试图理解这个answer合并使用awk的两个文件,我想出我的解决方案来满足我的需求。在使用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 

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

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

  1. FNR==NR{a[$1]=$2 FS $3;next}将在file2存储阵列a作为COLUMN2空间栏3至的file2末的条目处理。
  2. 现在就file1,我可以做{a[$1]=$2 FS $3}匹配来自file2那些行,这将给我所有的行中file1其列$1的价值a[$1]是相同COLUMN2价值$2空间栏3价值$3。现在问题来了。
  3. 在file1中匹配它们之后,我不知道如何按预期打印值。我试着打印$0a[$1]和他们给我分别

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

输出为顺序。我最担心的是因为在FNR==NR通过期间我没有捕获到file2的最后一列,我可能没有存储在我的数组中的值?或者我有它存储?

+1

岂不是最好的说'AWK“FNR == NR {A [$ 1 FS $ 2个FS $ 3] = $ 4;下一个}(($ 1 FS $ 2 FS $ 3)a){print $ 0,a [$ 1 FS $ 2 FS $ 3]}'f2 f1'? – fedorqui

+0

@fedorqui:错过了[a] = $ 4'的逻辑,这对我有帮助!请将其作为答案提供,以便参考! – Inian

回答

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一些问题。

  • 您的主要问题是$4file2。但是,你没有储存它。
  • 在访问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 
+0

这是一个很好的答案!我当然会接受它,只是等待一个比我的效率更高的逻辑 – Inian

+0

@EdMorton:请将其作为未来参考的答案发布! – Inian

相关问题