使用AWK反转两列并以逗号分隔输出的异常问题排查
AWK反转列输出异常的解决办法
直接可用的命令
要实现反转列且用逗号分隔的需求,执行这条命令即可:
awk 'BEGIN { FS=","; OFS="," } { sub(/\r$/,"",$1); print $2, $1 }' eol456.txt
如果你的系统支持进程替换,也可以先统一处理换行符再执行AWK:
awk 'BEGIN { FS=","; OFS="," } { print $2, $1 }' <(tr -d '\r' < eol456.txt)
问题根源
- 未设置输出分隔符:你只定义了输入字段的分隔符
FS=",",但AWK默认的输出字段分隔符OFS是空格,直接执行print $2,$1会用空格分隔两列,而非你需要的逗号,必须在BEGIN块里同时指定OFS=","。 - Windows换行符干扰:你的输入文件应该是Windows格式,每行结尾是
\r\n(回车+换行),而非Unix系统的\n。AWK读取时会把\r保留在第一列的末尾:- 单独打印第一列时,
\r会被终端解析为回车,后续的换行让显示看起来正常; - 组合打印时,
$1末尾的\r会让光标跳回行首,导致$1的内容覆盖了$2的开头部分,就出现了0x8da763b9E-PRINTING这类异常输出。
- 单独打印第一列时,
验证文件格式方法
用file命令可以快速确认文件的换行符类型:
file eol456.txt
如果输出包含CRLF line terminators,就说明是Windows格式的文件。
内容的提问来源于stack exchange,提问作者Musik847
相关产品推荐
相关产品推荐

