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"中复制/粘贴的。它不一定与粘贴的文件具有相同的记录数。
答案 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