2017-03-09 4 views
-2

私は、 "12122"というヘッダーとそれに続く文字列を含むfastaと呼ばれるタイルタイプを持っています。私は、ファイル内の重複した文字列を削除し、重複した文字列(同じもの)と対応するヘッダの1つだけを残したいと思います。 AGGTTCCGGATAAGTAAGAGCC以下の例で
はでユニークな線をフィルターする

を重複して:

>17-46151 
AGGTTCCGGATAAGTAAGAGCC 
>1-242 
AGGTTCCGGATAAGTAAGAGCC 
>18-41148 
TCTTAACCCGGACCAGAAACTA 
>43-16054 
GTCCCACTCCGTAGATCTGTTC 
>32-24116 
TAGCATATCGAGCCTGAGAACA 
>42-16312 
TGATACGGATGTTATACGCAGC 

アウト:

>1-242 
AGGTTCCGGATAAGTAAGAGCC 
>18-41148 
TCTTAACCCGGACCAGAAACTA 
>43-16054 
GTCCCACTCCGTAGATCTGTTC 
>32-24116 
TAGCATATCGAGCCTGAGAACA 
>42-16312 
TGATACGGATGTTATACGCAGC 
+0

なぜあなたは18-41148' '続けるのですか?それは重複していないようだ –

+1

申し訳ありませんが、私はユニークな文字列を保持したいと思います。もし複製されていれば複製物の1つを残しておきたい – user2300940

+1

あなたはexamplにPerlのハッシュを使ってみることができます: 'perl -nE 'chomp; chomp($ seq = <>); $ seqs {$ seq} = $ _; END {for(keys%seqs){say; $ seqs {$ _}}} 'in.txt' –

答えて

0

順序が必須でない場合順序は

# Field are delimited by new line 
awk -F "\n" ' 
    BEGIN { 
     # Record is delimited by ">" 
     RS = ">" 
     } 
    # skip first "record" due to first ">" 
    NR > 1 { 
     # if string is not know, add it to "Order" list array 
     if (! ( $2 in L)) O[++a] = $2 
     # remember (last) peer label/string 
     L[$2] = $1 
     } 
    # after readiong the file 
    END{ 
     # display each (last know) peer based on the order 
     for (i=1; i<=a; i++) printf(">%s\n%s\n", L[O[i]], O[i]) 
     } 
    ' YourFile 

必須である場合

awk -F "\n" 'BEGIN{RS=">"}NR>1{L[$2]=$1}END{for (l in L) printf(">%s\n%s\n", L[l], l)}' YourFile 
0
$ awk '{if(NR%2) p=$0; else a[$0]=p}END{for(i in a)print a[i] ORS i}' file 
>18-41148 
TCTTAACCCGGACCAGAAACTA 
>32-24116 
TAGCATATCGAGCCTGAGAACA 
>1-242 
AGGTTCCGGATAAGTAAGAGCC 
>43-16054 
GTCCCACTCCGTAGATCTGTTC 
>42-16312 
TGATACGGATGTTATACGCAGC 

の説明:

{ 
    if(NR%2)    # every first (of 2) line in p 
     p=$0 
    else     # every second line is the hash key 
     a[$0]=p 
} 
END{ 
    for(i in a)   # output every unique key and it's header 
     print a[i] ORS i 
} 
0

はここにあなたのための迅速な1行のawkのソリューションです。それは最後までデータをキューイング(と、それをループする)のではなく、行ずつ実行しますので、それは他の回答よりも迅速でなければなりません:

awk 'NR % 2 == 0 && !seen[$0]++ { print last; print } { last = $0 }' file 

説明:でも唯一の

  • NR % 2 == 0実行レコード(行、NR
  • !seen[$0]++格納インクリメント値を番号と、seen[]ハッシュ(!0が1であり、!1が0でない値が存在しない場合にのみ、trueを返しますは、
  • は(我々はそれ以外で終わった後に各行の値に設定されている)の端部にlastをスキップ等)、0である
  • { print last; print }last(ヘッダ)と、現在の行を印刷します

    >17-46151 
    AGGTTCCGGATAAGTAAGAGCC 
    >18-41148 
    TCTTAACCCGGACCAGAAACTA 
    >43-16054 
    GTCCCACTCCGTAGATCTGTTC 
    >32-24116 
    TAGCATATCGAGCCTGAGAACA 
    >42-16312 
    TGATACGGATGTTATACGCAGC 
    
    01:遺伝子コード)

注:これは、元の順序を維持しながら、期待出力最終一意に見られる例を示したが、それは最初一意に見られる例を示しています

あなたが最終一意に見インスタンスをしたい場合は、あなたがawkのに渡す前に、ファイルを逆にして、後で戻ってそれを逆にすることができます:

tac file |awk … |tac 
関連する問題