我有两个文件,我想用一个文件替换另一个文件中的字符串。第一个(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线长,所以这不是非常有效的方法。我在想一个阵列可能是要走的路,但对此并不确定。在结果之后,对方法不太挑剔!
答案 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