如何在awk中对文件的行进行计算

时间:2015-05-21 17:57:19

标签: awk

我有一个看起来像这样的文件:

88.3055
45.1482
37.7202
37.4035
53.777

我要做的是将值与第一行隔离并将其除以其他行的值(它是加速计算)。我想到可能将第一行存储在变量中(使用NR),然后迭代其他行以从分区中获取值。期望的输出是:

1,9559
2,3410
2,3608
1,6420

更新

抱歉Ed,我的错误,所需的小数点是.

我对Ed的答案进行了一些小改动,以便awk自己打印88.3055的分区并将其输出到文件speedup.dat:

awk 'NR==1{n=$0} {print n/$0}' tavg.dat > speedup.dat

是否可以在不使用中间文件和单个awk命令的情况下将speedup.dat的内容与另一个awk命令的结果结合起来?

第一个命令:

awk 'BEGIN { FS = \"[ \\t]*=[ \\t]*\" } /Total processes/ { if (! CP) CP = $2 } END {print CP}' cg.B.".n.".log ".(n == 1 ? ">" : ">>")." processes.dat

第一个命令输出:

1
2
4
8
16

粘贴两个文件:

paste processes.dat speedup.dat > prsp.dat

给出了现在想要的输出:

1   1
2   1.9559
4   2.34107
8   2.36089
16  1.64207

2 个答案:

答案 0 :(得分:3)

$ awk 'NR==1{n=$0;next} {print n/$0}' file
1.9559
2.34107
2.36089
1.64207

$ awk 'NR==1{n=$0;next} {printf "%.4f\n", n/$0}' file
1.9559
2.3411
2.3609
1.6421

$ awk 'NR==1{n=$0;next} {printf "%.4f\n", int(n*10000/$0)/10000}' file
1.9559
2.3410
2.3608
1.6420

$ awk 'NR==1{n=$0;next} {x=sprintf("%.4f",int(n*10000/$0)/10000); sub(/\./,",",x); print x}' file
1,9559
2,3410
2,3608
1,6420

通常,您只是使用正确的区域设置将.,作为小数点,但输入使用.,而输出使用,,我认为这不是一个选择。

答案 1 :(得分:-1)

awk '{if(n=="") n=$1; else print n/$1}' inputFile