1

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

#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
…

我用谷歌搜索并遇到CONVFMTawk. 但我不知道如何使用它,因为我真的不是 awk 的专家。这是在我的情况下使用的正确工具吗?如果是这样,我应该如何使用它?

我也想过编写一个 C++ 脚本,但直接命令行会很棒。

4

2 回答 2

5

我会使用awk的printf功能:

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

上面的命令输出:

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

简短说明:

NR==1评估true我们是否在第一行(NR == 记录数)。如果条件后面没有操作(介于{}),则 awk 仅打印该行,在这种情况下为标题。

NR>1true在除第一行输入之外的所有其他行上计算为。紧随其后的是一个动作,用于printf达到预期的结果。

于 2015-09-01T09:50:28.240 回答
0

您可以使用 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
于 2015-09-01T09:54:03.393 回答