使用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
答案 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
中删除。