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

时间:2015-06-30 16:58:28

标签: 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-biomass_c
S_cpd00322[c]   L-Isoleucine_c  

其中第1列对应于第二个文件中的字符串,第2列是我想要将这些字符串更改为的内容。文件2(Reactions.txt)如下所示:

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线长,所以这不是非常有效的方法。我在想一个阵列可能是要走的路,但对此并不确定。在结果之后,对方法不太挑剔!

1 个答案:

答案 0 :(得分:2)

您可以使用此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