使用awk对大文本文件中的行进行分组和汇总

时间:2018-12-12 22:20:29

标签: awk

我有一个大文本文件,例如以下示例:

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

我想根据第六列对行进行分组并求和 每个组的第四列。新文件将有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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

使用关联数组:

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

答案 2 :(得分:1)

如果可以接受排序输出,则不需要数组:

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 }'