使用 awk 跳过行值

问题描述 投票:0回答:1

我有以下输入文件:

 -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 sum row sequential
1个回答
0
投票

一般方法:

  • 添加除最后 N 个数字之外的所有数字
  • 当我们读取一个数字时,我们将其放入一个循环列表中(也称为一个数组,其索引基于对最后 N 取模的数字计数)
  • 当我们重复使用循环列表中的一个位置时,我们将之前的数字添加到总和中
  • 完成后,我们将得到一个循环列表,其中包含最后 N 个数字以及循环列表中的所有数字(但不包括这些数字)的总和

一个

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
© www.soinside.com 2019 - 2024. All rights reserved.