2017-03-09 74 views
-2

我有一個名爲fasta的瓦片類型,其中包含一個標題「> 12122」,後跟一個字符串。我想刪除文件中的重複字符串,並只保留一個重複的字符串(相同的)和相應的標題。
在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

對不起,我想保持獨特的字符串。如果其中一個重複,我想保留其中一個重複部分 – user2300940

+1

您可以嘗試在例子中使用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

這兒有你一個快速線awk的解決方案。因爲它通過線運行線,而不是排隊的數據(並通過它循環),直到最後它應該比其他的答案更直接:

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

說明:

  • NR % 2 == 0只運行在偶數編號的記錄(線,NR)只有當有在seen[]散列(!0是1沒有值
  • !seen[$0]++存儲和增量值並返回true,!1是0,!2爲0等)
  • (跳過到結束)last被設置爲每行的值之後我們否則用它做
  • { print last; print }將打印last(標題),然後將當前行(基因代碼)

注:雖然這保留了原來的順序,它顯示了第一唯一看到的實例,同時預期輸出顯示最後唯一看到的實例:

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

如果您希望最終看到的唯一實例,您可以扭轉的文件傳遞給AWK之前,然後反向回算賬:

tac file |awk … |tac