【问题标题】:Sum one column based on a pattern in another AWK根据另一个 AWK 中的模式对一列求和
【发布时间】:2016-05-11 20:38:24
【问题描述】:

我的输入文件如下:

scaffold100 115050  116050  1000    115050  124008  2
scaffold100 1167811 1168811 1000    1167811 1568661 0
scaffold100 151385  152385  1000    151385  193501  4
scaffold100 1585695 1586695 2000    1585695 1644609 5
scaffold100 1654143 1655143 2000    1654143 1673659 3
scaffold100 1711976 1712976 2000    1711976 1843374 1

我正在学习 AWK,我想用它来根据第 4 列对第 7 列求和。 也就是说,如果第 4 列等于 1000,则求和 2+0+4=6 并打印。

我正在使用这段代码,但我不明白我做错了什么:

awk '{if($4==1000) {sum+=$7;n++}END{print sum}}' file

【问题讨论】:

  • 阅读 Arnold Robbins 所著的《Effective Awk Programming, 4th Edition》一书。从那开始,然后您就不会对 awk 语法感到困惑,并像您发布的那样编写脚本。

标签: awk


【解决方案1】:

你可以使用这个awk

awk '$4==1000{sum+=$7}END{print sum+0}' file

输出:

$ awk '$4==1000{sum+=$7}END{print sum+0}' a
6

另一个awk

awk '{arr[$4]+=$7}END{for(val in arr){print val,arr[val]}}' file

输出:

$ awk '{arr[$4]+=$7}END{for (val in arr) {print val,arr[val]}}' a
2000 9
1000 6

【讨论】:

    【解决方案2】:

    你的大括号和大括号有点乱。

    $ cat data 
    scaffold100 115050  116050  1000    115050  124008  2
    scaffold100 1167811 1168811 1000    1167811 1568661 0
    scaffold100 151385  152385  1000    151385  193501  4
    scaffold100 1585695 1586695 2000    1585695 1644609 5
    scaffold100 1654143 1655143 2000    1654143 1673659 3
    scaffold100 1711976 1712976 2000    1711976 1843374 1
    $ awk 'BEGIN{sum=0}{if($4==1000) {sum+=$7}}END{print sum}' data
    6
    

    $awk '$4==1000 {sum+=$7} END{print sum}' data
    6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-14
      • 2017-04-20
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多