我在 Linux 机器上有一个制表符分隔的文件,其中包含两列。第一列包含名称,第二列包含 GO ID(这些 ID 始终GO:
为后跟七位数字的格式),以逗号分隔。我需要做的是,在每一行中只保留一个名称和一个唯一的 GO ID,丢弃重复项和多个条目。
由此
Pr_g33687.t1 GO:0003735,GO:0003735,GO:0003735,GO:0005840,GO:0006412,GO:0022618,GO:0022625
Pr_g33687.t1 GO:0003735,GO:0009129,GO:0006412
Pr_g15244.t1 GO:0000978,GO:0003700,GO:0005634,GO:0006357,GO:0034605
Pr_g15244.t1 GO:0003700,GO:0006355,GO:0043565
Pr_g15244.t1 GO:0003700,GO:0006355,GO:0043565
进入这个
Pr_g33687.t1 GO:0003735,GO:0005840,GO:0006412,GO:0022618,GO:0022625,GO:0009129
Pr_g15244.t1 GO:0000978,GO:0003700,GO:0005634,GO:0006357,GO:0034605,GO:0006355,GO:0043565
我将非常感激您的帮助。谢谢。
遥感
使用
awk
和datamash
:该
awk
命令将输入拆分开,使得以逗号分隔的值位于不同的行中而不是分组。然后该
datamash
命令将它们重新组合在一起并删除重复项。Sundeep 的答案比在 awk 中完成所有工作更整洁。它使用 GNU awk 专门处理数组的数组
请注意,这不会保留输入 GO 编号的顺序。您可以通过将其添加到 END 块来对结果进行排序:
该问题与将制表符分隔文件中的逗号分隔列表扩展为单独的行共享元素,并且您可以在Miller中使用类似的方法来分解、唯一化,然后分解数据:
如果您不介意输出顺序与输入顺序不同(它们将在输出中按字母顺序排序),则使用任意版本的强制性 POSIX 工具
awk
并实现Decorate-Sort-Undecoratesort
习语的变体:$1
$2
或者,假设输入按
$1
值分组,如问题中的示例所示,只使用任何awk
,只在内存中一次存储一个数据,并按照输入中出现的顺序$1
输出$1
和值:$2