【发布时间】: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 的评论。我希望问题现在更清楚了。