使用awk移除in.csv行尾逗号遇异常:所有内容输出至同一行
修复awk处理CSV时移除尾随逗号后输出合并的问题
问题情况
尝试用awk移除in.csv每行的尾随逗号,代码可执行但所有条目被输出到同一行。
输入文件in.csv内容
gene,transcript,cNomen,pNomen,Genomic Description,,,,,, ASXL1,NM_015338.5,c.1773C>A,p.Y591*,chr20:31022288C>A,,,,,, ASXL1,NM_015338.5,c.1954G>A,p.G652S,chr20:31022469G>A,,,,,,
预期输出
gene,transcript,cNomen,pNomen,Genomic Description ASXL1,NM_015338.5,c.1773C>A,p.Y591*,chr20:31022288C>A ASXL1,NM_015338.5,c.1954G>A,p.G652S,chr20:31022469G>A
当前使用的代码
awk -F',' '{ for (i=1; i<=NF; i++) { if ($i != "") { printf("%s", $i) } if (i<NF) printf(",") } printf(" ") }' in.csv
问题原因
- 代码中
printf(" ")的写法错误,Shell环境下双引号内的换行无法被正确解析为换行符,导致没有输出行分隔符,所有内容挤在一行。 - 原代码会在所有非最后字段后输出逗号,即使后续字段为空,可能产生多余逗号。
解决方案
使用以下awk代码,既可以移除尾随逗号、确保每行单独输出,还能避免中间产生多余逗号:
awk -F',' '{ sep = "" for (i=1; i<=NF; i++) { if ($i != "") { printf "%s%s", sep, $i sep = "," } } print "" }' in.csv
代码说明
- 初始化
sep为空字符串,用于控制字段间的逗号分隔逻辑。 - 遍历每个字段,仅输出非空字段:第一个非空字段直接打印,后续非空字段前添加逗号。
- 最后用
print ""输出换行符,保证每行内容独立显示。
另一种简洁写法
如果仅需要移除每行末尾的所有连续逗号,可直接用正则替换实现:
awk '{sub(/,*$/,"")}1' in.csv
代码说明
sub(/,*$/,""):用空字符串替换每行末尾的零个或多个连续逗号。1:awk简写语法,等价于执行print $0,输出处理后的整行内容。
内容的提问来源于stack exchange,提问作者justaguy
相关产品推荐
相关产品推荐

