我有一个看起来像这样的文件:
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
答案 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