删除 bash 中第一列中重复的行

删除 bash 中第一列中重复的行

我有一个制表符分隔的 .txt 文件,想要删除第一列中重复的行。如果这可以在不排序的情况下完成,那将是令人惊奇的,但我已经接受了我必须使用排序。如果我使用排序,则标题无法排序,它必须保持在顶部。

测试数据集(制表符分隔):

Symbol  ATCACGACAGACAGGT.1  ATCACGACAGCCTATA.1  TTTGTCATCATGTCTT.1  
STPG1   0   1   3
NFYA    0   0   1
STPG1   1   3   1
ABD 0   0   0
ABC 0   0   0

我梦想的输出:

Symbol  ATCACGACAGACAGGT.1  ATCACGACAGCCTATA.1  TTTGTCATCATGTCTT.1  
STPG1   0   1   3
NFYA    0   0   1
ABD 0   0   0
ABC 0   0   0

我的下一个最佳输出:

Symbol  ATCACGACAGACAGGT.1  ATCACGACAGCCTATA.1  TTTGTCATCATGTCTT.1  
ABC 0   0   0 
ABD 0   0   0   
NFYA    0   0   1
STPG1   0   1   3

我设法在逗号分隔的测试示例 testc.txt 上使用以下代码,但标头仍在排序中。我似乎无法找到一种分配有效的制表符分隔符的方法?另外,这段代码中的标头也有问题:

sort -u -t, -k1,1 testc.txt

也许我应该澄清一下,我不知道真实数据集中的行数、列数或行名称是什么。

答案1

您可以awk在这里使用:

$ awk -F'\t' 'NR==1 || !seen[$1]++' ip.txt
Symbol  ATCACGACAGACAGGT.1      ATCACGACAGCCTATA.1      TTTGTCATCATGTCTT.1
STPG1   0       1       3
NFYA    0       0       1
ABD     0       0       0
ABC     0       0       0
  • -F'\t'指定制表符作为分隔符
  • NR==1保留标题(尽管对于给定的输入,这不是必需的)- NR 是一个特殊变量,它将具有当前行号
  • !seen[$1]++在这里,seen数组将使用第一个字段作为键,如果该值为零(第一次看到键),则条件将变为 true

相关内容