You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:49:06