更改数据文件的双精度
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
…
我用谷歌搜索并找到了 awk
的 CONVFMT
选项。但我不知道如何使用它,因为我真的不是 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
我有一百个包含三个字段的文件。每一个看起来像这样(多行):
#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
…
我用谷歌搜索并找到了 awk
的 CONVFMT
选项。但我不知道如何使用它,因为我真的不是 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