使用具有名称信息的其他文件替换文件头

使用具有名称信息的其他文件替换文件头

我有几个 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

相关内容