заменить заголовки файлов другим файлом, который имеет информацию об имени

У меня есть пара быстрых файлов (OG000*.fas) файлов , которые мне нужно переименовать заголовки (т.е. все значения после ">"). Коварная часть заключается в том, что строка, которую мне нужно заменить в каждом заголовке, находится в отдельном файле с именем "names", поэтому я хочу, чтобы для каждого из "fas" файлов была найдена строка замены, основанная на строке в "names" файле.

Вот что я сделал до сих пор

for f in OG000*.fas; do grep ">" $f > ${f%.fas}.names; done

, который в основном записал заголовки в отдельные файлы, и используя эти *.names файлы, я нашел замену строк в "файле с именами"

for f in *.names; do grep -w -Ef $f names > ${f%.names}.rep; done

, так как вы можете видеть, что эти Rep-файлы имеют следующий формат:

ERR3393546_DBSCAN_round2_18. faa:>ERR3393546_k127_667963_61 # 82953 # 83516 # 1 # ID=38_61;partial=00;start_type=ATG;rbs_motif=None;rbs_spacer=None;gc_cont=0.520 ERR3393546_DBSCAN_round2_27.faa:>ERR3393546_k127_1356642_14 # 16672 # 17229 # 1 # ID=43_14;partial=00;start_type=ATG;rbs_motif=TAAAA;rbs_spacer=8bp;gc_cont=0.507 ERR3393546_DBSCAN_round2_9.faa:>ERR3393546_k127_931034_2 # 237 # 797 # -1 # ID=148_2;partial=00;start_type=ATG;rbs_motif=AATAA;rbs_spacer=7bp;gc_cont=0.556 ERR3393547_DBSCAN_round1_3.faa:>ERR3393547_k127_88473_83 # 97476 # 98036 # 1 # ID=5_83;partial=00;start_type=ATG;rbs_motif=TAA;rbs_spacer=11bp;gc_cont=0. 440

где строка после ":" - это то, как выглядит заголовок в оригинальном "fas" файле, а строка перед ":" - это то, как я бы хотел, чтобы новый заголовок выглядел

поэтому заголовки в новых "fas" файлах должны выглядеть так:

">ERR3393546_DBSCAN_round2_18"

">ERR3393546_DBSCAN_round2_27"

">ERR3393546_DBSCAN_round2_9"

">ERR3393547_DBSCAN_round1_3"

и вот я немного застрял, потому что у меня есть идея, что я должен использовать что-то вроде во время чтения Rep-файла; do sed. .. но я не могу обернуть голову вокруг пальца, как именно

любая помощь очень ценится

ps: Я не загрузил оригинальный "name" файл, потому что его 200MB

0
задан 19 April 2021 в 16:30

1 ответ

Хорошо, наверное, не самое элегантное решение, но вот что я придумал

sed -i 's/ .*//g' *.fas

for f in OG000*.fas; do grep ">" $f > ${f%.fas}.names; done
for f in *.names; do grep -w -Ef $f names > ${f%.names}.rep; done

sed -i 's/ .*//g' *.rep

for f in OG000*.fas; do awk -vRS="\n" -vORS="\t" '1' $f  | sed -e 's/\t>/\n>/g' > ${f}_file1; done
for f in *.rep; do awk -vRS=":" -vORS="\t" '1' $f | awk '{ $(NF+1)=$1; sub(/^[^ ]+ */,"") }1' > ${f}_file2; done

for f in *.rep_file2; do awk '
NR==FNR {vals[$1] = $2 " " $3 " " $4; next} 
!($1 in vals) {vals[$1] = "0 0 0"} 
{$(NF+1) = vals[$1]; print}
' $f ${f%rep_file2}fas_file1 | awk '{print $3,$2}' | sed -e 's/ /\n/g'     | sed -e 's/.faa//g' | sed "/DBSCAN/ s/^/>/" | sed "/.assembled/ s/^/>/" | sed "/_protein/ s/^/>/" > ${f}output; done
0
ответ дан 23 April 2021 в 23:21

Другие вопросы по тегам:

Похожие вопросы: