2014-02-25 34 views
1

我有许多列和数千行的几个文件。大多数条目的浮点精度太高,有些以科学记数法给出。我正在尝试使用awk重新格式化所有数字,但我对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 

。即该行中的第一个帖子,未格式化。

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列的数字格式?

+1

请添加一些样本输入数据和您的预期输出。 –

+0

对于OFMT +1,我没有意识到。另外,而不是'cat file | awk ...',你可以直接执行'awk ... file'。 – fedorqui

+0

那么,输出的最后一行基本上是输入,减去一些列。这是一个csv文件,包含一行标题,44列和数千行。如您所见,精度和格式会有所不同,但数据看起来像帖子底部附近的行。我的预期输出将是所有浮点数到小数点后两位的数字。 – mercergeoinfo

回答

0

忘记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 
+0

不幸的是我得到awk:调用未定义的函数strtonum – mercergeoinfo

+0

@mercergeoinfo:我已经编辑过使用'sprintf()'来代替。 – Birei

+0

对不起,但肯定有错误,awk只是坐着等待更多的东西。我尝试了额外的'但没有帮助 – mercergeoinfo