打印行号(如NR),但为$ 3中的每个新字段变量重新开始编号

时间:2017-11-02 15:53:38

标签: awk

使用AWK任何人都可以告诉我如何打印类似于NR功能的字段,除了在第3列($ 3)中看到新的“id”时编号重新开始。 使用命令'{print $0 "\t" $3"-exon-"NR}'数字外显子1到20 我想重新开始字段$ 3中每个新ID的编号(即497097,19888,20671,18777和58175)。对于此文件,所有id号都在相邻行上。我已经举了一个格式的例子,我试图在下面编码6美元。我的真实文件超过250,000行,还有更多字段。我认为这很容易,但我找不到正确的解决方案 谢谢!

chr gene    id  start   stop    exon_number  
1   Xkr4    497097  3216021 3216967 497097-exon-1  
1   Xkr4    497097  3421701 3421900 497097-exon-2  
1   Xkr4    497097  3670551 3671347 497097-exon-3  
1   Rp1 19888   4344599 4350090 19888-exon-1    
1   Rp1 19888   4351909 4352080 19888-exon-2  
1   Rp1 19888   4352201 4352824 19888-exon-3  
1   Sox17   20671   4491715 4492667 20671-exon-1  
1   Sox17   20671   4493099 4493405 20671-exon-2  
1   Lypla1  18777   4807913 4807981 18777-exon-1  
1   Lypla1  18777   4808454 4808485 18777-exon-2  
1   Lypla1  18777   4828583 4828648 18777-exon-3  
1   Lypla1  18777   4830267 4830314 18777-exon-4  
1   Lypla1  18777   4832310 4832380 18777-exon-5  
1   Lypla1  18777   4837000 4837073 18777-exon-6  
1   Lypla1  18777   4839386 4839487 18777-exon-7  
1   Lypla1  18777   4840955 4841131 18777-exon-8  
1   Lypla1  18777   4844962 4845015 18777-exon-9  
1   Rgs20   58175   4910473 4910661 58175-exon-1  
1   Rgs20   58175   4912313 4912547 58175-exon-2  
1   Rgs20   58175   4916896 4916979 58175-exon-3  

2 个答案:

答案 0 :(得分:1)

<强>一衬垫:

awk  'FNR==1{print $0,"exon_number";next}p!=$3{c=0;p=$3}{print $0, $3"-exon-"++c}' infile

<强>解释

 awk  'FNR==1{                             # If first line read by awk
           print $0,"exon_number";         # print current record, 
                                           # and other header for new field
           next                            # we are done go to next line
       }
       p!=$3{                              # if p is not equal to 3rd column
           c=0;                            # reset counter variable
           p=$3                            # set variable p with 3rd column value                                   
                                           # Here you assume p mean previous value
       }
       {
          print $0, $3"-exon-"++c          # print current record, 
                                           # 3rd field 
                                           # "-exon-" string and
                                           # pre-increment variable c
       }
      ' infile

答案 1 :(得分:1)

关注awk可能对您有帮助。

awk 'FNR==1{print $0,"exon_number";next} {printf("%s-exon-**%s**\n",$0 FS $3,val!=$3?(i=1):++i);val=$3}'  Input_file

输出如下。

chr gene    **id**  start   stop   exon_number
1   Xkr4    497097  3216021 3216967 497097-exon-**1**
1   Xkr4    497097  3421701 3421900 497097-exon-**2**
1   Xkr4    497097  3670551 3671347 497097-exon-**3**
1   Rp1 19888   4344599 4350090 19888-exon-**1**
1   Rp1 19888   4351909 4352080 19888-exon-**2**
1   Rp1 19888   4352201 4352824 19888-exon-**3**
1   Sox17   20671   4491715 4492667 20671-exon-**1**
1   Sox17   20671   4493099 4493405 20671-exon-**2**
1   Lypla1  18777   4807913 4807981 18777-exon-**1**
1   Lypla1  18777   4808454 4808485 18777-exon-**2**
1   Lypla1  18777   4828583 4828648 18777-exon-**3**
1   Lypla1  18777   4830267 4830314 18777-exon-**4**
1   Lypla1  18777   4832310 4832380 18777-exon-**5**
1   Lypla1  18777   4837000 4837073 18777-exon-**6**
1   Lypla1  18777   4839386 4839487 18777-exon-**7**
1   Lypla1  18777   4840955 4841131 18777-exon-**8**
1   Lypla1  18777   4844962 4845015 18777-exon-**9**
1   Rgs20   58175   4910473 4910661 58175-exon-**1**
1   Rgs20   58175   4912313 4912547 58175-exon-**2**
1   Rgs20   58175   4916896 4916979 58175-exon-**3**

PS: 如果您不想在上面的代码中使用**,那么您可以将其从printf中删除。