awk计算一列中的出现次数并在新列中打印

时间:2018-07-08 02:08:21

标签: awk sed grep

我有一个大文件,格式如下:

NC_019859.2 Gnomon  exon    58334   58504   .   -   .   GeneID:110014915
NC_019859.2 Gnomon  exon    54573   54723   .   -   .   GeneID:110014915
NC_019859.2 Gnomon  exon    52624   52680   .   -   .   GeneID:110014915
NC_019859.2 Gnomon  exon    52413   52551   .   -   .   GeneID:110014915
NC_019859.2 Gnomon  exon    28715   28784   .   -   .   GeneID:110014915
NC_019859.2 Gnomon  exon    26768   26814   .   -   .   GeneID:110014915
NC_019859.2 Gnomon  exon    25856   25914   .   -   .   GeneID:110014915
NC_019859.2 Gnomon  exon    25374   25727   .   -   .   GeneID:110014915
NC_019859.2 Gnomon  exon    70772   70841   .   -   .   GeneID:110017276
NC_019859.2 Gnomon  exon    70672   70687   .   -   .   GeneID:110017276
NC_019859.2 Gnomon  exon    70494   70586   .   -   .   GeneID:110017276
NC_019859.2 Gnomon  exon    69020   69335   .   -   .   GeneID:110017276
NC_019859.2 Gnomon  exon    68831   68928   .   -   .   GeneID:110017276
NC_019859.2 Gnomon  exon    68251   68721   .   -   .   GeneID:110017276
NC_019859.2 Gnomon  exon    89665   89909   .   +   .   GeneID:110014398
NC_019859.2 Gnomon  exon    91117   91579   .   +   .   GeneID:110014398
NC_019859.2 Gnomon  exon    119534  120075  .   -   .   GeneID:101166461
NC_019859.2 Gnomon  exon    118137  118262  .   -   .   GeneID:101166461
NC_019859.2 Gnomon  exon    117700  117831  .   -   .   GeneID:101166461
NC_019859.2 Gnomon  exon    117326  117490  .   -   .   GeneID:101166461

我要跟随期望的投放

NC_019859.2 Gnomon  exon    58334   58504   .   -   .   GeneID:110014915    exon_number:1 
NC_019859.2 Gnomon  exon    54573   54723   .   -   .   GeneID:110014915    exon_number:2
NC_019859.2 Gnomon  exon    52624   52680   .   -   .   GeneID:110014915    exon_number:3
NC_019859.2 Gnomon  exon    52413   52551   .   -   .   GeneID:110014915    exon_number:4
NC_019859.2 Gnomon  exon    28715   28784   .   -   .   GeneID:110014915    exon_number:5
NC_019859.2 Gnomon  exon    26768   26814   .   -   .   GeneID:110014915    exon_number:6
NC_019859.2 Gnomon  exon    25856   25914   .   -   .   GeneID:110014915    exon_number:7
NC_019859.2 Gnomon  exon    25374   25727   .   -   .   GeneID:110014915    exon_number:8
NC_019859.2 Gnomon  exon    70772   70841   .   -   .   GeneID:110017276    exon_number:1
NC_019859.2 Gnomon  exon    70672   70687   .   -   .   GeneID:110017276    exon_number:2
NC_019859.2 Gnomon  exon    70494   70586   .   -   .   GeneID:110017276    exon_number:3
NC_019859.2 Gnomon  exon    69020   69335   .   -   .   GeneID:110017276    exon_number:4
NC_019859.2 Gnomon  exon    68831   68928   .   -   .   GeneID:110017276    exon_number:5
NC_019859.2 Gnomon  exon    68251   68721   .   -   .   GeneID:110017276    exon_number:6
NC_019859.2 Gnomon  exon    89665   89909   .   +   .   GeneID:110014398    exon_number:1
NC_019859.2 Gnomon  exon    91117   91579   .   +   .   GeneID:110014398    exon_number:2
NC_019859.2 Gnomon  exon    119534  120075  .   -   .   GeneID:101166461    exon_number:1
NC_019859.2 Gnomon  exon    118137  118262  .   -   .   GeneID:101166461    exon_number:2
NC_019859.2 Gnomon  exon    117700  117831  .   -   .   GeneID:101166461    exon_number:3
NC_019859.2 Gnomon  exon    117326  117490  .   -   .   GeneID:101166461    exon_number:4

我尝试了此命令并得到了。

awk '{a[$9]++}END{for(i in a){print i, a[i]}}' 
GeneID:110014915 8
GeneID:110017276 6
GeneID:110014398 2
GeneID:101166461 4

提前感谢,期待积极的回应。

2 个答案:

答案 0 :(得分:3)

请您尝试以下。

awk '{print $0,"exon_number:"++a[$9]}'  Input_file

上述代码的解释:

print:是awk的开箱即用实用程序,用于打印变量/行。

$0:在awk语言中,$0是当前行(因此打印当前行)。

,:此处是逗号,分隔符将在$0和输出的下一个字符串之间输入一个空格。

"exon_number:":现在根据OP的输出打印字符串exon_number

++a[$9]:在这里,我创建了一个名为a的数组,其索引是第9列,并且在++之前先确保其值增加,然后再打印其数组a的值(这将简单地第9列的出现次数)。

如果需要将TAB输出分开,则也可以在上述代码中将awk更改为awk BEGIN{OFS="\t"}

答案 1 :(得分:2)

awk '$NF!=prev{cnt=0; prev=$NF} {print $0, "exon_number:"++cnt}' file

此答案与Ravinders答案之间的区别在于,他将创建一个由输入文件中每个键(GeneID)值索引的数组,而上述内容仅使用2个变量,因此使用的内存更少。他将对未排序的文件起作用,而我的仅在将键值分组在一起的情况下才起作用,如示例输入所示。从功能上讲,只有输入文件很大时,内存问题才重要。