AWK - END语句中的循环3不是所需的结果

时间:2016-05-19 15:36:37

标签: linux awk gawk

AWK新手。我有一个包含以下内容的文件:

FirstName,LastName,Email,ID,Number,IDToBeMatched
John,Smith,js@.com,js30,4,kt78
George,Haynes,gh@.com,gh67,3,re201
Mary,Dewar,md@.com,md009,4,js30
Kevin,Pan,kp@.com,kp41,2,md009
,,,,,ti10
,,,,,qwe909
,,,,,md009
,,,,,kor28
,,,,,gh67

我们的想法是检查标题ID下面的任何字段是否与IDToBeMatched下面的任何字段匹配,以及是否匹配打印整个记录但是最后一个字段(即IDToBeMatched)。所以我的最终输出应该如下:

FirstName,LastName,Email,ID,Number
John,Smith,js@.com,js30,4
George,Haynes,gh@.com,gh67,3
Mary,Dewar,md@.com,md009,4

到目前为止我的代码

    awk 'BEGIN{
        FS=OFS=",";SUBSEP=",";
}

{
      # all[$1,$2,$3,$4,$5]
        a[$4]++;
        b[$6]++;
}

END{ #for(k in all){
    for(i in a){
       for(j in b){
           if(i==j){
              print i #k
                    }
                   }       
                }
    #}
}' inputfile

仅打印匹配项。但是,如果我尝试通过取消注释上面脚本中的行来引入另一个循环,以便为匹配字段提供整行,那么事情会变得混乱。我理解为什么,但我找不到解决方案。我想介绍一个next语句,但END中不允许这样做。我的AWK默认为GAWK,我更喜欢(G)AWK解决方案。

提前谢谢。

最后一个字段有更多记录,因为它是从ID" pool"中复制/粘贴的。它不一定与粘贴的文件具有相同的记录数。

1 个答案:

答案 0 :(得分:0)

$ awk -F, 'NR==FNR{a[$6];next} (FNR==1)||($4 in a){sub(/,[^,]+$/,"");print}' file file
FirstName,LastName,Email,ID,Number
John,Smith,js@.com,js30,4
George,Haynes,gh@.com,gh67,3
Mary,Dewar,md@.com,md009,4