我有一个大文本文件,例如以下示例:
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
但是实际上它返回一个空文件。你知道如何解决吗?
答案 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 }'