bash - 根据字符串中的 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
解决方案
通过以下方式过滤掉重复项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
推荐阅读
- mysql - mysql中sqlite_master系统表的等价物是什么?
- reactjs - firestore 通过反应获取和显示数据
- opengl - 我应该尽可能使用最新的 GLSL 版本吗?
- ms-access - 比较 SQL 查询中行 SUM 的值
- css - 是否有适用于旧浏览器的 CSS“内容可见性”替代方案/polyfill?
- javascript - Nuxt Vue 中的 Splidejs
- python - 如何使用 PIL(或其他任何东西)将图像动态调整为文本大小?
- integer - 评分软件不断标记答案 - R 中数据的最小值和最大值之间的整数
- discord.py - 如何让我的 discord.py 机器人计算某个人发送的消息量?
- ruby-on-rails - 使用 upsert 时,“created_at”列中的空值违反非空约束