如何用awk删除CSV文件最后2列而非仅清空列内容?
用awk删除CSV文件最后2列的正确方法
你当前执行的命令仅清空了第10、11列内容,并未真正移除这两个字段,导致输出保留了多余逗号:
x=$(awk -v FPAT='([^,]*)|("[^"]+")' -v OFS=',' '{$10=$11=""; print $0}' ${filename} > nse.csv)
示例场景
原CSV内容:
a,b,c,d,e,f,g,h,i,j,k 1,2,3,4,5,6,7,8,9,10,11
执行上述命令后的错误输出:
a,b,c,d,e,f,g,h,i,, 1,2,3,4,5,6,7,8,9,,
期望得到的正确输出:
a,b,c,d,e,f,g,h,i 1,2,3,4,5,6,7,8,9
正确解决方案
由于你的CSV包含带引号的字段(已通过FPAT正确识别字段边界),需调整awk逻辑来移除最后两个字段,而非仅清空内容:
方法1:修改字段数NF(最简洁)
直接将字段数NF设置为NF-2,awk会自动丢弃后续字段,输出时不会产生多余逗号:
awk -v FPAT='([^,]*)|("[^"]+")' -v OFS=',' '{NF-=2; print $0}' ${filename} > nse.csv
方法2:手动拼接前NF-2个字段(兼容更多awk版本)
若担心部分awk版本对NF修改的兼容性,可手动遍历并拼接前NF-2个字段:
awk -v FPAT='([^,]*)|("[^"]+")' -v OFS=',' '{ out = $1 for (i=2; i<=NF-2; i++) { out = out OFS $i } print out }' ${filename} > nse.csv
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

