gpt4 book ai didi

linux - AWK - END 语句中的 3 for 循环不是期望的结果

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:32 27 4
gpt4 key购买 nike

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

想法是检查 header 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“池”不一定具有与其粘贴到的文件相同的记录数。

最佳答案

$ 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

关于linux - AWK - END 语句中的 3 for 循环不是期望的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37327985/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com