首页 > 解决方案 > 使用 awk 计算组的主题实例

问题描述

我有一个超过 20gb 的文件(这么多行。)这些行看起来像这样:

group1 motifA
group1 motifD
group1 motifD
group1 motifRalph
group1 motifA
group2 motifDenzel
group2 motifRodger
group2 motifHector
group2 motifDenzel
group2 motifA
group2 motifXYZ
group2 motifA
group2 motifDenzel
group3 motifHector
group3 motifRalph
group4 motifA
...
group10389

我想创建一个摘要文件,列出每个组中出现的主题以及出现的次数。例如:

group1 motifA 2
group1 motifD 2
group1 motifRalph 1
group2 motifDenzel 3
group2 motifRodger 1
group2 motifHector 1

但我想要所有的主题。我知道使用 awk 您可以使用 count 例如:

awk '{count[$1]++} END

但是如何为我描述的组计数呢?非常感激!

标签: unixawk

解决方案


请您尝试以下操作。在这里读取 Input_file 2 次。

awk 'FNR==NR{a[$1,$2]++;next} a[$1,$2]{print $0,a[$1,$2];delete a[$1,$2]}' Input_file Input_file

第二种方法:通过仅读取 1 次 Input_file(根据 Tiw 在评论部分的评论,可能需要一些时间,因为整个 Input_file 正在加载到内存中左右)。

awk '!a[$1 FS $2]++{b[++count]=$1 OFS $2;} {c[$1 FS $2]++}  END{for(i=1;i<=count;i++){print b[i],c[b[i]]}}'  Input_file

推荐阅读