【问题标题】:grouping and summarizing the rows in a big text file using awk使用 awk 对大文本文件中的行进行分组和汇总
【发布时间】:2018-12-12 22:20:29
【问题描述】:

我有一个像这个例子这样的大文本文件:

example:

chr11   314980  314981  63  IFITM1  -131
chr11   315025  315026  54  IFITM1  -86
chr5    315085  315086  118 AHRR    -53011
chr16   316087  316088  56  ITFG3   -86
chr16   316088  316089  90  ITFG3   -131
chr11   319672  319673  213 IFITM3  -131
chr11   319674  319675  514 IFITM3  -164

我想根据第 6 列对行进行分组并对值求和 从每组的第 4 列开始。新文件将有 2 列。第一列是组,第二列是总和 (来自类似组的第 4 列的值的总和)。预期输出 看起来像这样:

expected output:

-131    366
-86     110
-53011  118
-164    514

我正在尝试使用以下代码在awk 中执行此操作。

sort myfile.txt | awk -F'\t' '{ sub(/..$/,"**",$6) }1' OFS='\t' | awk '{print $1 "\t" $2}' > outfile.txt

但实际上它返回一个空文件。你知道怎么解决吗?

【问题讨论】:

  • 脚本输出空文件的唯一方法是输入一个空文件,因此输入文件为空,或者您发布的脚本不是您正在运行的脚本,或者您不是得到一个空的输出文件。另外,你希望sub(/..$/,"**",$6) 能为你做什么?

标签: awk


【解决方案1】:

我不知道您对代码的想法:为什么要用星号替换行中的最后 2 个字符?你为什么不在任何地方做任何添加?为什么要先排序(按第 1 列)?

awk -F'\t' '
    {sum[$6] += $4} 
    END {for (key in sum) {print key, sum[key]}}
' file | column -t

【讨论】:

    【解决方案2】:

    使用关联数组:

    awk '{a[$NF]+=$4}END{for (i in a){print i, a[i]}}' file
    

    【讨论】:

      【解决方案3】:

      如果您对排序输出没问题,则不需要数组:

      sort -k6n file |
      awk -F'\t' '
          grp != $6 {
              grp = $6
              printf "%s%s%s%s", sum, sep, grp, FS
              sum = 0
              sep = ORS
          } { sum += $4 } END { print sum }'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-16
        • 2016-06-04
        • 2017-05-31
        • 2014-06-29
        • 2018-03-23
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多