Linux下合并两个文件失败求助:仅显示file2内容且含^M字符
解决Linux下合并文件时内容被覆盖且出现^M的问题
问题根源
你遇到的情况其实是**Windows/DOS格式文本的回车符(^M)**在搞鬼:这个^M对应字符\r,当终端显示它时,会把光标跳回当前行的开头,导致file2的内容直接覆盖掉file1的内容——看起来输出只有file2,但实际上文件里已经完成了拼接,只是显示出了问题。
先验证问题
你可以用cat -A命令查看文件里的不可见字符,确认哪个文件是Windows格式:
cat -A file1 # 如果每行结尾显示为^M$,说明是Windows格式 cat -A file2
具体解决方案
方法1:先转成Unix格式再合并
如果你的系统安装了dos2unix工具,直接转换两个文件后再合并:
dos2unix file1 file2 # 执行合并 paste -d " " file1 file2 > output
如果没有dos2unix,可以用sed或tr手动去除回车符:
# 转换file1为Unix格式 sed 's/\r$//' file1 > file1.unix # 转换file2为Unix格式 sed 's/\r$//' file2 > file2.unix # 合并转换后的文件 paste -d " " file1.unix file2.unix > output
或者用tr命令删除回车符:
tr -d '\r' < file1 > file1.unix tr -d '\r' < file2 > file2.unix paste -d " " file1.unix file2.unix > output
方法2:合并时直接处理回车符(一步到位)
不用单独转换文件,直接在合并命令里处理^M:
- 用
paste结合sed:
paste file1 file2 | sed 's/\r//g;s/\t/ /g' > output
- 用
awk(更可靠,自动兼容不同换行符):
awk 'NR==FNR{a[NR]=$0;next} {print a[NR], $0}' file1 file2 > output
这个awk命令的逻辑是:先把file1的每一行存到数组里,再遍历file2的每一行,将对应行的内容拼接输出,完全不受Windows换行符的干扰。
验证结果
合并完成后,用cat output查看,就能正常显示每行是file1内容加file2内容的拼接了;再用cat -A output检查,确认已经没有^M字符。
内容的提问来源于stack exchange,提问作者Adam Majdi
相关产品推荐
相关产品推荐

