У меня есть пара быстрых файлов (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
Хорошо, наверное, не самое элегантное решение, но вот что я придумал
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