Переименовать файл, используя заголовок fasta - PullRequest
0 голосов
/ 11 января 2019

У меня есть несколько файлов fasta, загруженных из NCBI, и я хочу переименовать их с какой-то частью заголовка:

Пример заголовка: >KY705281.1 Streptococcus phage P7955, complete genome
Пример имени файла: KY705281.fasta

Идея состоит в том, чтобы избавиться от 'KY705281.1' и 'complete genome', чтобы остался только фаг Streptococcus P7955

Например, один входной файл будет:

>KY705281.1 Streptococcus phage P7955, complete genome
AGAAAGAAAAGACGGCTCATTTGTGGGTTGTCTTTTTTTGATTAAGTAATGAAGGAGGTGGATGTATTGG GCTAAATCAACGACAAAAACGATTTGCAGACGAATATTTGATATCTGGTGTCGCTTACAATGCAGCTATC AAAGCTGGGTATTCTGAGAAATACGCTAGAGCAAGAAGTCATACCTTGTTGGAAAATGTCGGCAT

Будет переименован в KY705281.fasta с содержанием:

>Streptococcus phage P7955 
AGAAAGAAAAGACGGCTCATTTGTGGGTTGTCTTTTTTTGATTAAGTAATGAAGGAGGTGGATGTATTGG GCTAAATCAACGACAAAAACGATTTGCAGACGAATATTTGATATCTGGTGTCGCTTACAATGCAGCTATC AAAGCTGGGTATTCTGAGAAATACGCTAGAGCAAGAAGTCATACCTTGTTGGAAAATGTCGGCAT

Я новичок в Linux, но с поиском в Google я знаю, что это легко сделать с помощью некоторых команд awk / sed / grep.
Любой совет был бы благодарен

1 Ответ

0 голосов
/ 12 января 2019

Один из способов может быть:

awk -F, 'FNR==1{match($1, "^>([^.]+)[^ ]+ (.*)", oFv); $1= ">" oFv[2]; sub(/ *complete genome */, "", $2);}{printf $0>oFv[1] ".fasta"}' somefiles*

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

Если вы хотите переименовать старые файлы, а также изменить их содержимое,
Учитывая вашу систему и bash, я думаю, что это GNU awk & GNU sed,
пожалуйста, сделайте резервную копию ваших файлов и попробуйте это:

#!/usr/bin/bash
for file in somefiles*; do
    nn="$(awk -F[\>.] '{printf $2 ".fasta";exit}' "file")"
    sed -ri '1{s/^[^ ]* />/;s/, complete genome//;}' "file"
    if [ ! -f "$nn"];
    then
        mv "file" "nn"
    else
        echo "'$nn' exists, skip '$file', its content already changed." | tee _err_.log
    fi
done

Или как вкладчик:

for file in somefiles*; do nn="$(awk -F[\>.] '{printf $2 ".fasta";exit}' "$file")"; sed -ri '1{s/^[^ ]* />/;s/, complete genome//;}' "$file"; if [ ! -f "$nn" ]; then mv "$file" "$nn"; else echo "'$nn' exists, skip '$file', its content already changed." | tee _err_.log; fi; done
...