我有以下输入文件:
-0.805813 0.874753 -0.776101 -0.749147 -0.636834 0.379035 -0.004061 -0.004061
-0.426119 -0.024801 -0.041989 -0.783686 0.361837 0.055206 0.368603 0.147965
-0.632526 -0.100358 0.847947 -0.690233 -0.996141 0.445275 1.086014 -1.097968
0.411383 0.411383 -0.734988 0.344954 2.577123 -0.372104 -0.923401 0.302907
0.302907 -1.424862 1.165900 -0.776100 -0.776100 -0.495400 0.182533 0.002356
0.002356 0.002356
我使用 awk 按顺序计算这些值的总和(sum = -3.0000):
awk '{ for (i=1; i<=NF; i++) sum += $i } END { printf("%3.4f", sum) }' input.txt
是否有可能使用 awk 从最后一行开始按顺序跳过值并计算其余值的总和?例如:
-0.805813 0.874753 -0.776101 -0.749147 -0.636834 0.379035 -0.004061 -0.004061
-0.426119 -0.024801 -0.041989 -0.783686 0.361837 0.055206 0.368603 0.147965
-0.632526 -0.100358 0.847947 -0.690233 -0.996141 0.445275 1.086014 -1.097968
0.411383 0.411383 -0.734988 0.344954 2.577123 -0.372104 -0.923401 0.302907
0.302907 -1.424862 **1.165900 -0.776100 -0.776100 -0.495400 0.182533 0.002356
0.002356 0.002356**
我想跳过 ** 之间的值。应跳过的值的数量可能会有所不同。
谢谢!
我已经通过使用 sed 管道和 awk 实现了这一点:
sed '$d' input.txt | awk '{ for (i=1; i<=NF; i++) sum += $i } END { for (i=NF-5; i<=NF; i++) sum -= $i; print sum }'
但是,更优选纯 awk 单行代码。
一般方法:
一个
awk
想法:
awk -v lastn=desired_number '
BEGIN { for (i=0;i<lastn;i++) last[i]="X" } # initialize our array
{ for (i=1;i<=NF;i++) {
cnt++ # increment count of numbers seen so far
ndx=cnt%lastn # calculate our modulo index
sum+=(circlist[ndx] != "X" ? circlist[ndx] : 0) # add previous entry from circlist[] ?
circlist[ndx]=$i # add current value to circlist[]
}
}
END { printf("%3.4f", sum) }
' input.txt
对于 OP 的第二组数据,我们使用
lastn=8
生成:
-2.3079