使用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时:
$0的实际内容是原始行内容加末尾的\r,比如第一行的$0为ZRSR2_10A_F_P5,18,chrX,15822707,15822993,287,chrX\r- awk用OFS(逗号)拼接
$0、$4、$4+$2,得到字符串ZRSR2_10A_F_P5,18,chrX,15822707,15822993,287,chrX\r,15822707,15822725 - 输出时,
\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
相关产品推荐
相关产品推荐

