删除重复行

删除重复行

我有一个包含一堆行的文件,如下所示(只是文件头):

    "chrom" "startA" "stopA" "genesA" "startB" "stopB" "genesB" "test"
    1 315121 317607 "gene2" 315521 317204 "gene3" 1684
    1 315521 317204 "gene3" 315121 317607 "gene2" 1684
    1 407644 408993 "gene4" 408421 409504 "gene5" 573
    1 407644 408993 "gene4" 408616 410013 "gene6" 378
    1 408421 409504 "gene5" 407644 408993 "gene4" 573
    1 408421 409504 "gene5" 408616 410013 "gene6" 889
    1 408616 410013 "gene6" 407644 408993 "gene4" 378
    1 408616 410013 "gene6" 408421 409504 "gene5" 889
    1 408616 410013 "gene6" 409682 411483 "gene7" 332
....

有一些相同的行(同一对基因,只是开始和停止位置的顺序不同,但它们完全相同),我需要删除重复的行。例如:

1 315121 317607 "gene2" 315521 317204 "gene3" 1684
1 315521 317204 "gene3" 315121 317607 "gene2" 1684

是相同的,它是基因 2 和 3 的组合,只是顺序不同,我想删除其中一个。

这是我想要的输出:

"chrom" "startA" "stopA" "genesA" "startB" "stopB" "genesB" "test"
    1 315121 317607 "gene2" 315521 317204 "gene3" 1684
    1 407644 408993 "gene4" 408421 409504 "gene5" 573
    1 407644 408993 "gene4" 408616 410013 "gene6" 378
    1 408421 409504 "gene5" 408616 410013 "gene6" 889
    1 408616 410013 "gene6" 409682 411483 "gene7" 332

我知道如何完成这项任务吗?谢谢

答案1

您可以尝试:

awk '{key = $4 < $7 ? $4 SUBSEP $7 : $7 SUBSEP $4} !seen[key]++' file

它存储删除重复记录所需的最少内容。

!seen[key]++是一个“著名”的 awk 习惯用法,仅在第一次看到“key”时才打印记录。

答案2

您可以根据第一列中的值对列 2-3-4 和 5-6-7 的三元组进行排序:

perl -lane '@F[1,2,3,4,5,6] = @F[4,5,6,1,2,3] if $F[1] > $F[4]; print "@F"'

然后您可以运行sort -u以删除重复项(但您需要对列名称进行特殊处理)。

答案3

确保每行:

  • 第一个字段之前没有空间
  • 字段之间正好有 1 个空格
  • 最后一个字段没有空格

通过 gnu sed,您的数据位于“data”文件中;

sed -nE ':s G;/(\w+\s)(\w+\s)(\w+\s)(\S+\s)(\w+\s)(\w+\s)(\S+\s)(\w+)\n(.+\n)*\1\w+\s\6\7\w+\s\3\4\8/b; h;P' data

相关内容