我有一个包含 9 列的 csv 文件,其中每三列都有不同的行。该文件看起来像
1 6.2 0.5 1 0.08 0.5 1 0.001 0.1
2 5.2 0.6 2 0.01 1.3 2 0.008 0.8
3 4.3 0.7 3 0.002 0.32
4 2.0 0.7 4 0.2 0.35
5 13.1 1.3 5 0.54 4.32
6 1.02 1.67
我想使用 bash 脚本将任何空字段替换为零。我想要产生的结果应该是这样的
1 6.2 0.5 1 0.08 0.5 1 0.001 0.1
2 5.2 0.6 2 0.01 1.3 2 0.008 0.8
3 4.3 0.7 3 0.002 0.32 3 0 0
4 2.0 0.7 4 0.2 0.35 4 0 0
5 13.1 1.3 5 0.54 4.32 5 0 0
6 1.02 1.67 6 0 0 6 0 0
答案1
解决方案对列数进行硬编码,并假设只有后面的列可能为空:
awk 'BEGIN { OFS=FS="\t" } {
$1=NR; if(!$2)$2=0; if(!$3)$3=0;
$4=NR; if(!$5)$5=0; if(!$6)$6=0;
$7=NR; if(!$8)$8=0; if(!$9)$9=0;
print }' /path/to/your.csv
答案2
尝试这个:
awk -v cols=9 '{
printf "%s", $0
for (n = NF; n < cols; n++) printf "\t%d", (n % 3 == 0 ? NR : 0)
print ""
}' file
列数作为变量传递,cols
因此您可以轻松更改它。我没有费心对齐输出数据。