Unix下替换data.ped首列值遇^M异常问题求助
解决ped文件替换后出现^M字符的问题
你的问题根源很明确:ids.txt文件带有Windows风格的换行符(\r,也就是你看到的^M)。当awk读取这个文件时,会把行尾的\r一并存入数组a[$1]的值中,导致替换后首列后面跟着这个看不见的回车符,最终出现异常输出。
快速诊断
先确认ids.txt的格式,用以下命令查看:
cat -A ids.txt
如果每行结尾显示^M$,就说明是Windows格式的文件(行尾是\r\n,而Unix系统只用\n)。
解决方案
下面提供几种可行的解决办法:
方法1:转换文件为Unix格式(推荐)
使用dos2unix工具直接转换ids.txt的换行符:
dos2unix ids.txt
之后再运行你原来的awk命令:
awk 'NR==FNR{a[$1]=$2; next} $1 in a{$1=a[$1]; print}' ids.txt data.ped > output.ped
如果系统没有dos2unix,可以用sed替代:
sed -i 's/\r$//' ids.txt
方法2:在awk命令中直接处理换行符
不用修改原始文件,在读取ids.txt时就去掉行尾的\r:
awk 'NR==FNR{ # 去掉行尾的回车符 sub(/\r$/, "", $2) a[$1] = $2 next } $1 in a { $1 = a[$1] print }' ids.txt data.ped > output.ped
方法3:强制指定输出字段分隔符
如果替换后还是有格式问题,可以强制指定输出字段分隔符为空格,避免awk默认分隔符带来的意外:
awk 'BEGIN{OFS=" "} NR==FNR{sub(/\r$/,"",$2); a[$1]=$2; next} $1 in a{$1=a[$1]; print}' ids.txt data.ped > output.ped
验证结果
处理完成后,再用cut -f 1-6 -d " " output.ped | less查看,应该就不会再出现^M字符了。
内容的提问来源于stack exchange,提问作者Nuthatch92
相关产品推荐
相关产品推荐

