Python 如何用从另一个文件(数组)分配的变量替换一个文件中的字符串

Python 如何用从另一个文件(数组)分配的变量替换一个文件中的字符串,python,arrays,regex,sed,Python,Arrays,Regex,Sed,我有两个文件,我想用一个替换另一个文件中的字符串。第一个(Names.txt)如下所示: S_AA_45_biomass[c] AA-biomass_c S_B10[c] L-Isoleucine-biomass_c S_B11[c] L-Leucine-biomass_c S_B12[c] L-Lysine-biomass_c S_B13[c] L-Methionine-biomass_c S_B14[c] L-Phenylalanine-

我有两个文件,我想用一个替换另一个文件中的字符串。第一个(Names.txt)如下所示:

S_AA_45_biomass[c]  AA-biomass_c    
S_B10[c]    L-Isoleucine-biomass_c  
S_B11[c]    L-Leucine-biomass_c 
S_B12[c]    L-Lysine-biomass_c  
S_B13[c]    L-Methionine-biomass_c  
S_B14[c]    L-Phenylalanine-biomass_c
S_cpd00322[c]   L-Isoleucine_c  
B10_c   L-Isoleucine biomass reaction   S_cpd00322[c]  -> S_B10[c]      0     0.00  1000.00   0.00
B10_c   L-Isoleucine biomass reaction   L-Isoleucine_c  -> L-Isoleucine-biomass_c       0     0.00  1000.00   0.00
其中,第1列对应于第二个文件中的字符串,第2列是我希望将这些字符串更改为的内容。文件2(Reactions.txt)如下所示:

S_AA_45_biomass[c]  AA-biomass_c    
S_B10[c]    L-Isoleucine-biomass_c  
S_B11[c]    L-Leucine-biomass_c 
S_B12[c]    L-Lysine-biomass_c  
S_B13[c]    L-Methionine-biomass_c  
S_B14[c]    L-Phenylalanine-biomass_c
S_cpd00322[c]   L-Isoleucine_c  
B10_c   L-Isoleucine biomass reaction   S_cpd00322[c]  -> S_B10[c]      0     0.00  1000.00   0.00
B10_c   L-Isoleucine biomass reaction   L-Isoleucine_c  -> L-Isoleucine-biomass_c       0     0.00  1000.00   0.00
我想要的是这样的输出:

S_AA_45_biomass[c]  AA-biomass_c    
S_B10[c]    L-Isoleucine-biomass_c  
S_B11[c]    L-Leucine-biomass_c 
S_B12[c]    L-Lysine-biomass_c  
S_B13[c]    L-Methionine-biomass_c  
S_B14[c]    L-Phenylalanine-biomass_c
S_cpd00322[c]   L-Isoleucine_c  
B10_c   L-Isoleucine biomass reaction   S_cpd00322[c]  -> S_B10[c]      0     0.00  1000.00   0.00
B10_c   L-Isoleucine biomass reaction   L-Isoleucine_c  -> L-Isoleucine-biomass_c       0     0.00  1000.00   0.00
我试图使用sed来替换每个字符串,并编写for循环:

for i in `cat Names.txt `; do cat Reactions.txt | grep -F `echo $i | cut -f1` | sed 's/`echo $i | cut -f1`/`echo $i | cut -f2`/' >>output.txt; done

除了由于Names.txt文件中的特殊字符以及在将结果写入output.txt之前每行只替换一个单词,这两个文件都超过2000行,因此这不是一种非常有效的方法。我在想,阵列可能是一种方式,但这还远远不能确定。不要太挑剔的方法,只是在一个结果

您可以使用此
awk

awk 'FNR==NR {
    a[$1] = $2;
    next
} {
    for (i=1; i<=NF; i++)
       printf (($i in a)? a[$i] : $i) ((i<NF)? OFS : ORS)
}' Names.txt Reactions.txt

B10_c L-Isoleucine biomass reaction L-Isoleucine_c -> L-Isoleucine-biomass_c 0 0.00 1000.00 0.00
awk'FNR==NR{
a[$1]=$2;
下一个
} {

对于(i=1;看起来不错,但可能我不清楚标签应该在Reactions.txt文件中的什么位置。输入应该是:B10_cL-异亮氨酸生物量反应L-异亮氨酸c->L-异亮氨酸-生物量_c00.001000.000.00,我想将标签保留在输出文件中的这些位置。啊,该死的,谢谢注意!是的,输入应该如下所示:B10_cL-异亮氨酸生物量反应\u cpd00322[c]->S_B10[c]00.001000.000.00,并且Names.txt也是一个两列选项卡分隔的文件:S_AA_45_Biomatile[c]AA-BIOMAL\U cIf第二个文件使用制表符作为分隔符,那么它必须在
->
之前和之后都有制表符。很抱歉我不知道,但我不确定我是否遵循。你的意思是我需要将第二个文件更改为在
->
之前和之后都有制表符吗?如果是这样,那将不起作用,因为第三个c中的空间分隔反应物的数量列可以变化,因此会产生具有不同字段数的行。我希望您能够修改您编写的第一个脚本,以便在输出中保留制表符分隔的字段。我知道我们在这里不是要说谢谢,而是要说谢谢。非常有帮助。最后,我只是剪切了输入文件的第三个字段,并将其保存为一个文本然后我将原始输入文件和输出文件粘贴在一起,并使用awk将我想要的字段打印到一个新文件中。