0

我使用了下面的 awk 命令

awk -F ':' '
  { s3 += $3; }
  { s4=s4+$4; }
  { s5=s5+$5; }
  END { print s3,","s4,","s5,","s3/s5 }' sample.txt > sample1.txt

我的输入文件(sample.txt)是:

05/05/2013:0:47623.49:1007:180
05/05/2013:1:35959.84:1959:132
05/05/2013:2:26317.05:690:85
05/05/2013:3:8715.40:107:32
05/05/2013:4:5713.27:66:24
05/05/2013:5:10533.34:1025:17
05/05/2013:6:10748.54:602:58
05/05/2013:7:44429.87:1644:203
05/05/2013:8:97096.44:4320:415
05/05/2013:9:148065.87:6603:639
05/05/2013:10:194488.19:8426:900
05/05/2013:11:231119.09:10991:986
05/05/2013:12:263701.11:10771:1070
05/05/2013:13:275892.40:10005:1054
05/05/2013:14:272595.88:9702:1120
05/05/2013:15:286506.75:10953:1110
05/05/2013:16:119102.11:4298:504

但命令会自动四舍五入,输出为:

2078610.00,83169 ,8529 ,243.711 

我希望输出为2078609.56(没有四舍五入的精确值),如何在 awk 中实现这一点?

4

2 回答 2

3

试试这一行:

 awk -F ':' '{ s3 += $3;s4+=$4;s5+=$5} END{ printf "%.2f,%d,%d,%f", s3,s4,s5,s3/s5 }' input

awk 可以使用 function 指定输出格式printf。我注意到您的 $3 和$3/$5可能需要特殊精度,我只是添加%.2f and %f,您可以根据需要进行调整。

上述行的输出:

2078608.64,83169,8529,243.710709

我不知道您是如何2078609.56在输入文件中获得“精确值”错字的?

于 2013-05-05T21:04:16.053 回答
1

问题是默认输出格式 ( OFMT) 舍入到前六个最高有效数字 ( %.6g)。您可以修改此值以%.10f打印小数点后 10 位。您可以将命令的第一行更改为:

awk -F ':' -vOFMT=%.10f '

也将s3/s5其视为浮点数您应该将END闭包修改为

END { print s3,",",s4,",",s5,",",s3/s5 }'

使用这个有两个问题:

  1. OFMT仅适用于浮点数。类似123or的数字123.00在 awk 内部被视为整数,因此它们将在不使用此变量的情况下打印。恕我直言,问题中的输出应该是这样的:

    2.07861e+06 , 83169 , 8529 , 243.711

  2. 实际上不是该2078609.56值是确切的值。由于数字以二进制形式表示,因此它们将按原样添加。因此,如果您将输出格式设置为,%.10f您将得到如下内容:

    2078608.6399999999、83169、8529、243.7107093446

于 2013-05-06T07:26:51.350 回答