重複行の削除

重複行の削除

次の行を含むファイルがあります(ファイルヘッダーのみ)。

    "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の組み合わせですが、順序だけ違うだけですが、そのうちの1つを削除したいと思います。

これが私が望む結果です:

"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イディオムです。

答え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

関連情報