使用awk设置数字格式

使用awk设置数字格式,awk,number-formatting,Awk,Number Formatting,我有几个文件,有许多列和数千行。大多数条目都是浮点数,精度太高,有些条目是用科学符号表示的。我试图使用awk来重新格式化所有的数字,但我对awk不是很熟悉。我试过以下方法 cat bs04_diff_all_e.csv | awk -v OFS="," -v OFMT="%.2f" -F"," 'NR == 45 {printf $1,$2,$3,$4,$11,$12,$13,$14,$15,$16,$17,$18,$19}' 哪个输出 648376.819998 只是。i、 e.线路中的

我有几个文件,有许多列和数千行。大多数条目都是浮点数,精度太高,有些条目是用科学符号表示的。我试图使用awk来重新格式化所有的数字,但我对awk不是很熟悉。我试过以下方法

cat bs04_diff_all_e.csv | awk -v OFS="," -v OFMT="%.2f" -F"," 'NR == 45 {printf $1,$2,$3,$4,$11,$12,$13,$14,$15,$16,$17,$18,$19}' 
哪个输出

648376.819998
只是。i、 e.线路中的第一根立柱,未格式化

cat bs04_diff_all_e.csv | awk -v OFS="," -v OFMT="%.2f" -F"," 'NR == 45 {print $1,$2,$3,$4,$11,$12,$13,$14,$15,$16,$17,$18,$19}' 
输出

648376.819998,7537575.31999,1692.0,34.99202,0.30931,0.0054,0.07764,0.01284,0.00849,0.04081,0.0403,0.00946,-9e-05

因此,我得到了列,但格式仍然不起作用。我环顾四周寻找解决方案,不明白为什么这不起作用,但正如我前面所说的,我不熟悉awk。我做错了什么?我真的必须为所有44列分别指定数字格式吗?

忘记
OFMT
变量,在变量之前使用
sprintf()
格式字符串。最后一个
END{}
节删除后面的逗号:

cat bs04_diff_all_e.csv | 
    awk -F"," '
        BEGIN { split("1,2,3,4,11", l, /,/) } 
        { for (i in l) { s = s sprintf( "%.2f,", $(l[i]) ) } }
        END { sub(/,$/, "\n", s); print s }
    '
它产生如下结果:

648376.82,7537575.32,1692.00,34.99,0.04

请添加一些示例输入数据和预期输出。+1对于OFMT,我不知道。另外,您可以直接执行
awk…,而不是
cat文件| awk…
。。。文件
。输出的最后一行基本上是输入,减去一些列。这是一个csv文件,有一行标题、44列和数千行。如您所见,精度和格式各不相同,但数据看起来像文章底部附近的线条。我的预期输出将是浮点数到小数点后2位的所有数字strtonum@mercergeoinfo:我编辑了这篇文章,改为使用
sprintf()
。很抱歉,一定是某个地方出错了,awk只是坐在那里等待更多信息。我试过“额外”但没用help@mercergeoinfo:它在我的壳里工作。试着自己解决它,把所有的脚本放在一行。或者添加第一行,当它工作时,添加第二行,依此类推。我不能帮你,因为我不能复制它。至少我需要更多的信息。我试着把所有的信息放在一条线上,但问题是一样的,它只是坐在那里等待。我将尝试用Python解决这个问题。我已经花了大约5个小时在这上面了,我需要继续前进,如果只是为了我的理智。