【问题标题】:awk how to sum all even columns in each lineawk 如何对每行中的所有偶数列求和
【发布时间】:2021-03-06 23:11:14
【问题描述】:

我有一个包含数字行的文件。我想打印第一列,以及每行中偶数列的总和。

输入示例:

1 2 3 4 5 6
5 6 5 6 5 6
1 2 1 2 1 2

期望的输出:

1 12
5 18
1 6

这是否可以使用 awk 或任何其他工具来实现?

谢谢!

附:我不想用

awk '{print $1, $2+$4+$6}'

因为我的真实文件有 60 列

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    使用循环将列号增加 2 并将列添加到总变量中。

    awk '{total = 0; for (i = 2; i <= NF; i+=2) total += $(i); print $1, total}' filename
    

    【讨论】:

      【解决方案2】:
      $ awk '{for(i=4;i<=NF;i+=2) $2+=$i; print $1,$2}' file
      

      更新

      对于时序测试,使用了 4 行的 10,000 列数据文件。

      $ seq 10000 | paste -s > t && cat t t t t > data
      

      每个测试 3 次,这是两个最差的时间

      $ time awk '{for(i=4;i<=NF;i+=2) $2+=$i; print $1,$2}' data > /dev/null
      
      real    0m0.066s
      user    0m0.015s
      sys     0m0.015s
      
      $ time awk '{s=$2; for(i=4;i<=NF;i+=2) s+=$i; print $1,s}' data > /dev/null
      
      real    0m0.067s
      user    0m0.015s
      sys     0m0.047s
      

      GNU awk 4.1.4

      【讨论】:

      • 这比使用变量存储总和效率要低,因为每次增加 $2 时它都会强制 awk 重新编译 $0。
      • @EdMorton 测试至少在我使用的awk 版本中没有显示出任何低效率。
      • 当我尝试使用具有更大数据集的 gawk 5.1.0 以进入秒计时时,我看到带有变量的版本始终稍快一些,但差异并不像我预期的那么大.我无法想象为什么每次直接增加 $2 时都需要重建 $0。我想是好(还是坏?)工作呆滞的家伙实现这个功能?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      相关资源
      最近更新 更多