为什么awk处理CSV文本时会覆盖先打印的列内容?
问题原因
你遇到的问题核心有两点:
- 打印字段顺序不符合预期:你当前命令中的打印顺序是
$13 $14 $4 $5 $6,会先输出第13、14列,再输出第4、5、6列,和你想要的输出顺序不符。 - CSV解析规则不严谨、未设置输出分隔符:直接用逗号作为字段分隔符处理带双引号的CSV,若后续字段内部出现逗号会出现切分错误;同时你打印时字段之间没有加分隔符,会导致所有字段直接拼接在一起,看起来像是内容截断。
解决方案
如果你用的是GNU awk(绝大多数Linux发行版默认预装的awk版本),推荐用FPAT参数正确解析带引号的CSV格式,调整后的命令如下:
awk 'BEGIN { FPAT = "([^,]+)|(\"[^\"]+\")"; OFS=" " } { print $4, $5, $6, $13, $14 }'
参数说明:
FPAT定义了CSV字段的匹配规则,可以正确识别被双引号包裹的字段,哪怕字段内部包含逗号也不会切分错误OFS=" "设置输出字段之间的分隔符为空格,你也可以根据需要换成制表符\t、逗号,等其他分隔符
如果你使用的awk版本不支持FPAT,且可以确定所有CSV字段内部都不包含逗号,也可以直接调整打印顺序和输出分隔符:
awk 'BEGIN { FS=","; OFS=" " } { print $4, $5, $6, $13, $14 }'
输出效果
用你提供的输入运行上述命令,会得到以下符合预期的输出:
"15-20m." "50-100cm" "Mature" 56.4645790890058 -2.86562748812157 "10-15m." "25-50cm" "Mature" 56.4644143392449 -2.8660619300834
内容的提问来源于stack exchange,提问作者Ben Williams
相关产品推荐
相关产品推荐

