使用AWK匹配两文件字段仅返回最后匹配结果,求问题原因
问题分析与解决
你的命令逻辑本身是对的,只返回最后一个匹配结果的核心原因是file1的换行符格式问题,或者说你给整个awk命令设置的分隔符在处理file1时带来了隐形问题。
问题根源
你用-F';'给整个awk进程设置了字段分隔符,但file1里的每行都是纯数字、没有分号,所以awk处理file1时会把整行内容作为$1。如果你的file1是Windows格式(每行结尾是\r\n,而非Unix的\n),那么$1会包含末尾的\r(回车符,肉眼不可见),比如数组里的键是"58000\r"、"72518\r",而file2里的$1是纯数字"58000",自然匹配不上。只有当file1的最后一行刚好没有\r时,才会匹配成功,这就导致你只得到最后一个结果。
修正后的命令
有两种简单的解决方式:
方式1:针对不同文件切换分隔符
处理file1时用默认的行分隔(把整行作为匹配键),处理file2时再设置分号分隔符:
awk 'NR==FNR{a[$0]; next} BEGIN{FS=";"} $1 in a' file1 file2
方式2:统一清除隐形控制字符
不管文件格式如何,先清除每行末尾的回车、换行等隐形字符,再存入数组:
awk -F';' 'NR==FNR{gsub(/[\r\n]+$/,"",$0); a[$0]; next} $1 in a' file1 file2
验证方法
你可以用cat -A file1查看file1的隐形字符,如果每行结尾显示^M$(^M就是\r),就说明是Windows换行符导致的问题。
内容的提问来源于stack exchange,提问作者Luiz Bom
相关产品推荐
相关产品推荐

