Как переименовать заголовки во многих мультифаст-файлах с именем файла? - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть каталог с несколькими сотнями файлов multi-FASTA.Эти файлы называются с именем вида или рода, например:

Bubo_bubo.fasta
Poa_CC7849.fasta
Homo_sapiens.fasta
...

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

>c5_g1_i1 len=168 path=[174:0-148 24:148-168]

Я бы хотел переименовать заголовки в каждом из этих файлов, добавив информацию о видах, из которых он происходит.Другими словами, заголовок должен содержать в начале имя файла.Например, если приведенный выше заголовок взят из Bubo_bubo.fasta, он должен выглядеть следующим образом:

>Bubu_bubo_c5_g1_i1 len=168 path=[174:0-148 24:148-168]

Поэтому я хочу написать цикл, который будет принимать имя файла и использовать его для добавления этой информации в каждый заголовок fastta.в этом конкретном файле, и я хочу сделать это для всех файлов в каталоге.

1 Ответ

0 голосов
/ 10 декабря 2018

Следующие действия помогут вам:

awk '(FNR==1){f=FILENAME;sub(/\.[A-Za-z]*$/,"_",f)}
     /^>/{$0=">" f substr($0,2)}
     1' Bubo_bubo.fasta

Это, однако, запишет все на экран, возможно, вас заинтересуют новые файлы.Таким образом, вы можете использовать bash с перенаправлением для нескольких файлов как:

for f in *.fasta; do
   awk '(FNR==1){f=FILENAME;sub(/\.[A-Za-z]*$/,"_",f)}
        /^>/{$0=">" f substr($0,2)}
        1' "$f" > "/path/to/new/location/$(basename $f)"
done

Если вы действительно хотите, вы можете делать все в самом awk, и это будет:

awk '(FNR==1){                             # When a new file is opened (first record)
        close(fout);                       # close previous output file
        fout=FILENAME
        sub(".*/", "", fout)               # get basename of file
        f=fout                             # set f to basename of file
        fout="path/to/new/location/" fout  # prepend output directory
        sub(/\.[A-Za-z]*$/,"_",f)          # remove extention from f
     }
     /^>/{$0=">" f substr($0,2)}           # if header found, update it
     {print > fout}                        # print to output file
    ' *.fasta
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...