AWK按第一列匹配两个CSV文件失效问题排查
解决AWK匹配Windows换行符导致结果为空的问题
你猜的没错——main_file.csv里的Windows换行符(\r\n)就是罪魁祸首。当AWK读取main_file.csv的行时,第一列的值末尾会带上隐藏的\r字符,导致和filter_file.csv里的目标值(比如151622-0)完全不匹配,所以结果文件才会是空的。
给你两种直接可行的解决办法:
方法1:先转换文件换行符(永久修改文件)
用dos2unix工具把main_file.csv的Windows换行符转成Unix格式(\n):
dos2unix main_file.csv
之后再执行你原来的AWK命令就能正常匹配了。
方法2:在AWK命令里直接处理\r(无需修改原文件)
修改AWK脚本,在读取main_file.csv的行时,自动去掉第一列末尾的\r字符:
awk 'BEGIN {FS=OFS=";"} NR==FNR{a[$1]=1; next} {sub(/\r$/,"",$1)} a[$1]{print}' filter_file.csv main_file.csv > result_file.csv
或者也可以直接清理整行末尾的\r,效果一样:
awk 'BEGIN {FS=OFS=";"} NR==FNR{a[$1]=1; next} {sub(/\r$/,"")} a[$1]{print}' filter_file.csv main_file.csv > result_file.csv
如果是通过PHP的exec执行这个命令,注意用单引号包裹AWK脚本部分,避免PHP转义干扰命令逻辑。
内容的提问来源于stack exchange,提问作者Dexter0015
相关产品推荐
相关产品推荐

