首页 > 解决方案 > 根据字符串中的 ID 删除重复的行

问题描述

我想根据GeneID:输入行中的数字删除重复项(并仅保留第一个重复项)。我只知道如何按列过滤:awk '!seen[$3]++'但这在这里不起作用。

输入(制表符分隔):

 Gene1 mRNA ID=rna74353;Parent=gene38534;Dbxref=GeneID:109200613;Genbank:XM_019356191.2,Genbank:XM_025904163.1
 Gene2 mRNA ID=rna74354;Parent=gene38534;Dbxref=GeneID:109200613;Genbank:XM_019356192.2,Genbank:XM_025904163.2
 Gene3 mRNA ID=rna74355;Parent=gene38534;Dbxref=GeneID:109200614;Genbank:XM_019356193.2,Genbank:XM_025904163.3
 Gene4 mRNA ID=rna74356;Parent=gene38534;Dbxref=GeneID:109200615;Genbank:XM_019356194.2,Genbank:XM_025904163.4

出去:

 Gene1 mRNA ID=rna74353;Parent=gene38534;Dbxref=GeneID:109200613;Genbank:XM_019356191.2,Genbank:XM_025904163.1
 Gene3 mRNA ID=rna74355;Parent=gene38534;Dbxref=GeneID:109200614;Genbank:XM_019356193.2,Genbank:XM_025904163.3
 Gene4 mRNA ID=rna7435;Parent=gene38534;Dbxref=GeneID:109200615;Genbank:XM_019356194.2,Genbank:XM_025904163.4

标签: bashawksed

解决方案


通过以下方式过滤掉重复项GeneID

$ awk 'BEGIN{ FS=OFS="\t" }{ f3=$3; sub(";.*", "", f3) }!a[f3]++' test.txt

细节:

  • FS=OFS="\t"- 输入/输出字段分隔符
  • f3=$3- 将第三个字段值复制到变量中f3
  • sub(";.*", "", f3);-从值中删除所有字符f3(仅获取带前缀的 GeneID 编号)
  • !a[f3]++- 在关键变量的唯一出现时打印记录f3

输出:

Gene1   mRNA    GeneID:109200613;Genbank:XM_019356191.2
Gene1   mRNA    GeneID:109200614;Genbank:XM_019356193.2
Gene1   mRNA    GeneID:109200615;Genbank:XM_019356193.2

推荐阅读