使用映射文件替换文件中的多个字符串

时间:2014-04-23 07:12:23

标签: string map replace awk

如何使用映射文件(+ 50K行)替换一个大文件(+ 500K行)中的多个字符串?映射文件的结构如下:

A1  B1
A2  B2
A3  B3
..  ..

并且大文件的结构如下:

A1  A2
A1  A3
A1  A8
A2  A1
A2  A3
A3  A10
A3  A13

并且必须使用映射文件替换大文件中的每个字符串。

想要的结果:

B1  B2
B1  B3
B1  B8
B2  B1
B2  B3
B3  B10
B3  B13

我尝试在映射文件的每一行使用awk但是需要很长时间......这是awk命令。所以我为映射文件的每一行写了一个循环启动awk命令,我将结果保存在一个临时文件中,并将这个结果用在一个带有映射文件下一行的新awk中(我知道效率不是很高)。

cat inputBigFile.txt | awk '{ gsub( "A1","B1" );}1' > out.txt

提前致谢

1 个答案:

答案 0 :(得分:2)

$ awk 'NR==FNR{map[$1]=$2;next} {if($1 in map)$1=map[$1]; if($2 in map)$2=map[$2]}1' mappings file
B1
B1
B1 A8
B2
B2
B3 A10
B3 A13

我假设专门检查并替换两列比NF和/或gsub上的循环更快。

编辑:重要的是:

$ wc -l file
8388608 file

$ time awk 'NR==FNR{map[$1]=$2;next} {if($1 in map)$1=map[$1]; if ($2 in map)$2=map[$2]}1' mappings file >/dev/null
real    0m6.941s
user    0m6.904s
sys     0m0.016s

$ time awk 'NR==FNR{map[$1]=$2;next} {for(i=1;i<=NF;i++)$i=($i in map)?map[$i]:$i}1' mappings file >/dev/null
real    0m10.311s
user    0m10.249s
sys     0m0.036s

$ awk --version | head -n 1
GNU Awk 3.1.8