我有几个 fasta 文件 (OG000*.fas)文件我需要重命名标题(即“>”后面的所有值)。棘手的部分是,我需要在每个标题中替换的字符串位于名为“names”的单独文件中,因此我希望每个“fas”文件都基于“names”文件中的一行找到替换字符串。
以下是我目前所做的
for f in OG000*.fas; do grep ">" $f > ${f%.fas}.names; done
它基本上将标题写在单独的文件中,并使用这些 *.names 文件我在“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;部分=00;start_type=ATG;rbs_motif=无;rbs_spacer=无;gc_cont=0.520 ERR3393546_DBSCAN_round2_27.faa:>ERR3393546_k127_1356642_14 # 16672 # 17229 # 1 # ID=43_14;部分=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;部分=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;部分=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”
现在我有点卡住了,因为我有点想用类似的东西while read rep file; do sed
......但我不知道该怎么做
任何帮助是极大的赞赏
附言:我没有上传原始的“names”文件,因为它有 200MB
答案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