gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:52:32 26 4
gpt4 key购买 nike

如何使用映射文件(+ 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

提前致谢

最佳答案

$ 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

关于string - 使用映射文件替换文件中的多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23237338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com