更改数据文件的双精度

Change double precision of data file

我有一百个包含三个字段的文件。每一个看起来像这样(多行):

#time data1 data2
20 1.9864547484940e+01 -3.96363547484940e+01
40 2.164547484949e+01 -3.2363547477060e+01 
60 1.9800047484940e+02 -4.06363547484940e+02
…

它们很重,有些需要 1.5G。我想通过以较低的双精度保存最后两列并删除 e+0? 项来减小它们的大小。例如,我想将上面的四行转换为:

#time data1 data2
20 19.865 -39.636
40 21.645 -32.364
60 198.00 -406.36
…

我用谷歌搜索并找到了 awkCONVFMT 选项。但我不知道如何使用它,因为我真的不是 awk 的专家。这是适合我的情况的工具吗?如果是这样,我应该如何使用它?

我也想过写一个C++脚本,但是直接命令行就好了。

我会使用 awk 的 printf 函数:

awk 'NR==1;NR>1{printf "%d %.3f %.3f\n", , , }' file

以上命令输出:

#time data1 data2
20 19.865 -39.636
40 21.645 -32.364
60 198.000 -406.364

简短说明:

如果我们在第一行(NR == 记录数),

NR==1 的计算结果为 true。如果一个条件后面没有一个动作(在 {} 之间),awk 只打印该行,在本例中是 headers.

NR>1 在除第一行输入之外的所有其他行上计算为 true。它后面跟着一个动作,它使用 printf 来达到预期的结果。

你可以使用 coreutils:

head -n1 infile; tail -n+2 infile | while read n1 n2 n3; do printf "%d %.3f %.3f\n" $n1 $n2 $n3; done

输出:

#time data1 data2
20 19.865 -39.636
40 21.645 -32.364
60 198.000 -406.364