Соберите слово в одном файле и используйте это слово для сопоставления в файле FASTA, добавив последовательность FASTA в первый файл.

Я хочу найти несколько слов в файле1 и использовать каждое слово для поиска того, что следует после его совпадения в файле2.fasta. Затем я хочу добавить то, что следует за совпадением со словом, которое я использовал, в файл 03, чтобы файл 03 содержал информацию из обоих файлов. Часть файлов у меня есть:

файл1:

Jan12345: ID1 ID2 ... IDN1
Jan67899: ID11 ID12 ... IDN2

И файл Fasta (file2), например:

>ID1
ABCDEFG
>ID2
HIJKLMN
>IDN1
OPQRSTU
>ID11
WXYZABC
>ID12
DEFGHIJ
>IDN2
KLMNOPQ

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

Jan12345 ID1 ABCDEFG ID2 HIJKLMN ... IDN1 OPQRSTU
Jan67899: ID11 WXYZABC ID12 DEFGHIJ... IDN2 KLMNOPQ

Как видите, я просто хочу добавить последовательность FASTA, содержащуюся в файле2, в файл1. Если кто-нибудь знает, как это сделать, я был бы очень признателен!


person Stenemo    schedule 13.06.2013    source источник
comment
Что вы уже пытались попробовать?   -  person hwnd    schedule 13.06.2013
comment
Насколько ID11 ABCDEFG верно. Разве это не должно быть ID11 WXYZABC?   -  person jaypal singh    schedule 13.06.2013
comment
Что такое FASTA и нужно ли мне знать, что это такое, чтобы понять этот вопрос?   -  person innaM    schedule 13.06.2013
comment
en.wikipedia.org/wiki/FASTA_format (хотя и не совсем актуально)   -  person Stenemo    schedule 14.06.2013


Ответы (3)


В одну сторону с awk

awk '
NR==FNR && /\>/ {
    x=$0
    getline b
    a[substr(x,2)]=b
    next
} 
{
    for (i=2;i<=NF;i++) {
        for (k in a) {
            if ($i==k) {
                $i=$i" "a[k]
            }
        }
    }
}1' file2 file1

Один лайнер:

awk 'NR==FNR{NF==2?k=$2:a[k]=$1;next}{for(i=2;i<=NF;i++){for(k in a){$i=$i==k?$i OFS a[k]:$i}}}1' FS="[> ]" file{2,1}

Вывод с вашими образцами данных:

$ awk 'NR==FNR {NF==2?k=$2:a[k]=$1;next}{for(i=2;i<=NF;i++){for(k in a){$i=$i==k?$i OFS a[k]:$i}}}1' FS="[> ]" file{2,1}
Jan12345: ID1 ABCDEFG ID2 HIJKLMN IDN1 OPQRSTU
Jan67899: ID11 WXYZABC ID12 DEFGHIJ IDN2 KLMNOPQ
person jaypal singh    schedule 13.06.2013

Читает файл fasta/file2 в хэш %h и делает замену для каждой строки в файле1,

perl -pe 'BEGIN{open F,pop;%h=map{y|\r\n>||d;$_}<F>} s|(ID\S+)|$1 $h{$1}|g' file1 file2
person mpapec    schedule 13.06.2013

уродливый способ с GNU sed:

  • шаг I: создайте командный скрипт

    sed -r 's#^(\S+)\s+#${x;s/^\\s\\\|>//g;p};1{s/.*/\1/;h};/\n#;h;s/\n.*//;x;s/.*\n//;:ka;s#(\S+)\s*#\\b\1\\b\\| #;H;g;s/\n(\S+).*/\1/;x;s/.*\n\S+\s*//;tka;s/\\\|\n/\/!d;$!N;H;x;s\/\\n\/ \/g;x/' file1 > file.sed
    
  • шаг II: создайте файл результата с помощью bash

    #!/bin/bash
    while read p; do 
    sed -n $p file2
    done < file.sed > file3
    
person Endoro    schedule 15.06.2013