【问题标题】:AWK - 3 for loops in END statement not desired resultAWK - 3 for END 语句中的循环不是期望的结果
【发布时间】:2016-09-16 14:45:31
【问题描述】:

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“池”中复制/粘贴的,该 ID“池”不一定具有与粘贴的文件相同的记录数。

【问题讨论】:

  • 您能否在不添加空格和不删除逗号的情况下显示您的文件?更清楚一点,为什么最后五行只有一个字段?另一件事,每行的末尾是否真的有一个逗号,标题是否真的存在?
  • @CasimiretHippolyte 我更新了我的问题。此外,不,标题末尾没有逗号。如果这使事情变得更容易,我们可以跳过标题(也许使用 NR>1 ?)
  • 在这种情况下,不要复制/粘贴 ID“pool”,并使用 awk 处理这两个文件(更简单):awk 'NR==FNR{...;next}FNR>1{...}' idpool inputfile
  • 感谢您的建议。问题:这是否意味着如果文件的内容最初如上所述,有人必须删除一列并将其粘贴到另一个文件才能获得结果?
  • @EdMorton:对不起,它指的是 CasimirHippolyte 的评论。我希望问题现在更清楚了。

标签: linux awk gawk


【解决方案1】:
$ 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

【讨论】:

  • 非常感谢@EdMorton。它就像一个魅力。作为 AWK 的新手,问 sub(/,[^,]+$/,"") 的作用是不是太过分了?提前致谢。
  • 不客气。它会删除从最后一个逗号到行尾的所有内容,就像sed -r 's/,[^,]+$//' 一样。我强烈推荐 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书。
  • 非常感谢@edmorton 的解释和建议(这本书似乎可以在线免费获得)
  • 虽然这本书可以在线免费获得,但我建议每个人都购买一份副本,这样作者就可以从他继续在书中投入的所有工作以及其他文档和提供 GNU awk 中获得一些小额补偿。我买了一本,经常参考。
猜你喜欢
  • 2013-12-28
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多