Удалить дублированный элемент в файл - PullRequest
0 голосов
/ 23 марта 2020

Привет, у меня огромный файл, вот заголовок:

>Sequence1:p
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence2:ok
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence3/lo
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence:LJ
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence3/lo
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
ATTGGAGAGA
>Sequence:YU
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
ATTAGAG
>Sequence:LJ
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
ATTGGAGAGA
....

Как видите, файл состоит из нескольких последовательностей:

они всегда начинаются с его имя: >name и сопровождается буквами.

Здесь я хотел бы удалить дублирующиеся последовательности с именами

В примере:

>Sequence:LJ и >Sequence3/lo присутствуют дважды.

Тогда я хотел бы только продолжить и получить новый файл без дублированных последовательностей:

>Sequence1:p
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence2:ok
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence3/lo
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence:LJ
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
ATTGGAGAGA
>Sequence:YU
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
ATTAGAG

у кого-то есть идея с кодом bash или чем-то еще?

Ответы [ 4 ]

5 голосов
/ 23 марта 2020
$ awk '/>/{c=a[$1]++}!c' file
>Sequence1:p
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence2:ok
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence3/lo
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence:LJ
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence:YU
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
ATTAGAG
4 голосов
/ 23 марта 2020

awk должен быть очень полезен здесь, не могли бы вы попробовать, написали и протестировали с показанными образцами.

awk 'match($0,/^>.*/){val=substr($0,RSTART+1,RLENGTH-1);if(!array[val]++){found=1} else{found=""}} found'  Input_file

Или добавьте здесь форму решения, не относящуюся к одному вкладышу:

awk '
match($0,/^>.*/){
  val=substr($0,RSTART+1,RLENGTH-1)
  if(!array[val]++){
    found=1
  }
  else{
    found=""
  }
}
found
'  Input_file

Вывод будет следующим.

>Sequence1:p
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence2:ok
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence3/lo
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence:LJ
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence:YU
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
ATTAGAG
3 голосов
/ 23 марта 2020

Другой awk:

$ awk 'BEGIN{RS=">"}NR>1&&!a[$1]++{printf ">%s",$0}' file

Вывод:

>Sequence1:p
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence2:ok
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence3/lo
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence:LJ
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
>Sequence:YU
AAAAAAACCCCCTTTGGGGAGAGAGAGGAACACAGATAATGATAAGTAGATATGATTATAGTAG
CAGAYAGTATGAGTAGTAAGTGAATTAGTAGTAGTAGATGATGA
ATTAGAG
1 голос
/ 23 марта 2020

Самый простой способ обработки файлов FASTA с помощью awk - это создать переменную с именем name и переменную с именем seq. Каждый раз, когда вы читаете полную последовательность, вы можете обработать ее. Заметьте, что для лучшего способа обработки последовательность должна храниться как непрерывная строка и не должна содержать никаких новых строк или пробелов. Общий c awk для обработки fasta выглядит следующим образом:

awk '/^>/ && seq { process_sequence_here }
     /^>/{name=$0; seq=""; next}
     {seq = seq $0 }
     END { process_sequence_here }' file.fasta

Вы можете сделать это немного проще, введя несколько функций:

awk '/^>/ && seq { process_sequence(name_seq) }
     /^>/{name=substr($0,2); seq=""; next}
     {seq = seq $0 }
     END { process_sequence(name,seq) }

     BEGIN{seq_ere=sprintf("%80s","");gsub(" ",".",seq_ere) }
     function print_sequence(name,seq) {
         gsub(seq_ere,"&" ORS, seq); print ">" name ORS seq
     }
     function process_sequence(name,seq) { ... }
    ' file.fasta

В случае OP, приведенное выше будет выглядеть так:

awk '/^>/ && seq { process_sequence(name_seq) }
     /^>/{name=substr($0,2); seq=""; next}
     {seq = seq $0 }
     END { process_sequence(name,seq) }

     BEGIN{seq_ere=sprintf("%80s","");gsub(" ",".",seq_ere) }
     function print_sequence(name,seq) {
         gsub(seq_ere,"&" ORS, seq); print ">" name ORS seq
     }
     function process_sequence(name,seq) {
         if ! (name in a) print_sequence (name,seq)
         a[name]
     }
    ' file.fasta

Когда вы обрабатываете fasta-файлы с помощью awk, вы всегда можете использовать bioawk . Он имеет все навороты из POSIX awk, но дополнен для простой обработки файлов FASTA:

Примечание: BioAwk основан на awk Брайана Кернигана , который задокументирован в "Языке программирования AWK" Аль Ахо, Брайана Кернигана и Питера Вайнбергера (Addison-Wesley, 1988, ISBN 0-201-07981-X) . Я не уверен, что эта версия совместима с POSIX .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...