如何用Grep从大文件中提取每个邮编的首个匹配行?
如何为每个邮编仅保留一条匹配行?
你可以通过awk实现需求,它能跟踪已处理的邮编,确保每个邮编只输出第一条匹配行,以下是两种常用方式:
方式一:直接用awk处理两个文件
单行命令即可完成,无需先通过grep过滤:
awk 'BEGIN{while((getline zip < "infile.txt")>0) target_zips[zip]=1} $1" "$2 in target_zips && !outputted[$1" "$2]++' bigfile.txt
命令解释:
BEGIN块:先读取infile.txt中的所有邮编,存入target_zips数组作为匹配目标。- 处理
bigfile.txt时,取每行前两个字段拼接成完整邮编,检查是否在目标列表中:- 如果该邮编未被输出过(
!outputted[$1" "$2]++),则输出当前行,并标记该邮编已处理。
- 如果该邮编未被输出过(
方式二:先过滤再去重
如果需要先通过grep筛选出所有匹配行,再用awk去重:
grep -f infile.txt bigfile.txt | awk '!outputted[$1" "$2]++'
这个命令先让grep提取所有符合infile.txt的行,再用awk只保留每个邮编的第一条匹配结果。
示例输出
执行上述命令后,你的示例输入会得到如下结果:
9417 TG Spier Drenthe NLD Netherlands 52.8178 6.4592 ; 9423 TA Hoogersmilde Drenthe NLD Netherlands 52.9098 6.3685 ; 9431 HK Westerbork Drenthe NLD Netherlands 52.8613 6.6029 ; 9883 TB Zuurdijk Groningen NLD Netherlands 53.3147 6.3558 ; 9965 TN Zuurdijk Groningen NLD Netherlands 53.3506 6.3691 ;
为什么grep单独无法实现?
grep的-m 1参数是全局仅返回第一个匹配行,而非每个邮编对应返回一条,因此无法满足“每个邮编保留一条”的需求。
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

