如何使用映射文件(+ 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
提前致谢
答案 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