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

使用Awk为CSV表格添加计算列时输出异常的原因咨询

awk处理CSV时输出异常的原因及解决

问题场景

原始CSV数据:

ZRSR2_10A_F_P5,18,chrX,15822707,15822993,287,chrX
ZRSR2_10B_F_P5,18,chrX,15822876,15823101,226,chrX
ZRSR2_10C_F_02_P5,22,chrX,15823055,15823310,256,chrX

期望输出:

ZRSR2_10A_F_P5,18,chrX,15822707,15822993,287,chrX,15822707,15822725
ZRSR2_10B_F_P5,18,chrX,15822876,15823101,226,chrX,15822876,15822894
ZRSR2_10C_F_02_P5,22,chrX,15823055,15823310,256,chrX,15823055,15823077

执行的命令:

awk -F, -v OFS=, '{print $0,$4,$4+$2}'

异常输出:

,15822707,15822725chrX,15822707,15822993,287,chrX
,15822876,15822894chrX,15822876,15823101,226,chrX
,15823055,1582307722,chrX,15823055,15823310,256,chrX

异常原因

核心问题是输入文件使用了Windows风格的换行符(\r\n),awk读取行时会保留行尾的\r(回车符)在$0中。执行print $0,$4,$4+$2时:

  1. $0的实际内容是原始行内容加末尾的\r,比如第一行的$0为ZRSR2_10A_F_P5,18,chrX,15822707,15822993,287,chrX\r
  2. awk用OFS(逗号)拼接$0、$4、$4+$2,得到字符串ZRSR2_10A_F_P5,18,chrX,15822707,15822993,287,chrX\r,15822707,15822725
  3. 输出时,\r会让终端光标回到行首,后续的,15822707,15822725会覆盖行首内容,最终呈现异常输出。

解决办法

只需在处理行前移除行尾的\r,修改后的命令如下:

awk -F, -v OFS=, '{sub(/\r$/,""); print $0, $4, $4+$2}' input.csv

也可以先用tr命令预处理文件去除\r:

tr -d '\r' < input.csv | awk -F, -v OFS=, '{print $0, $4, $4+$2}'

两种方式都能解决换行符导致的光标回退问题,得到符合预期的输出。


内容的提问来源于stack exchange,提问作者Manolo Dominguez Becerra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:34:51