SED或AWK脚本替换多个文本

Dha*_*lan 5 python unix perl awk sed

我正在尝试使用sed脚本执行以下操作,但这需要花费太多时间.看起来我正在做错事.

场景:我有学生记录(> 100万)students.txt.在此文件中(每行)前10个字符是学生ID,接下来10个字符是联系号码,依此类推

students.txt

1000000001 9234567890 XXX ...
1000000002 9325788532 YYY ...
.
.
.
1001000000 8766443367 ZZZZ ...

我有另一个文件(encrypted_contact_numbers.txt),其中包含所有电话号码和相应的加密电话号码,如下所示

encrypted_contact_numbers.txt

Phone_Number,Encrypted_Phone_Number

9234567890,1122334455
9325788532,4466742178
.
.
.
8766443367,2964267747

我想students.txt用相应的加密电话号码替换所有联系号码(第11-20位)encrypted_contact_numbers.txt.

预期产出:

1000000001 1122334455 XXX ...
1000000002 4466742178 YYY ...
.
.
.
1001000000 2964267747 ZZZZ ......

我使用下面的sed脚本来执行此操作.它工作正常但速度太慢.

方法1:

while read -r pattern replacement; do   
    sed -i "s/$pattern/$replacement/" students.txt
done < encrypted_contact_numbers.txt
Run Code Online (Sandbox Code Playgroud)

方法2:

sed 's| *\([^ ]*\) *\([^ ]*\).*|s/\1/\2/g|' <encrypted_contact_numbers.txt |
sed -f- students.txt > outfile.txt
Run Code Online (Sandbox Code Playgroud)

有没有办法快速处理这个巨大的文件?

更新:2018年2月9日

如果电话号码在指定位置(第10-20栏),AWK和Perl中提供的解决方案正常工作,如果我尝试进行全局更换,则需要花费太多时间来处理.有没有最好的方法来实现这一目标?

students.txt:更新版本

1000000001 9234567890 XXX ... 9234567890
1000000002 9325788532 YYY ...
.
.
.
1001000000 8766443367 ZZZZ 9234567890 ......

kar*_*kfa 5

awk 救援!

如果你有足够的内存来保存phone_map文件在内存中

awk -F', *' 'NR==FNR{a[$1]=$2; next}
                    {key=substr($0,11,20)}
           key in a {$0=substr($0,1,10) a[key] substr($0,21)}1' phone_map data_file
Run Code Online (Sandbox Code Playgroud)

没有测试,因为你错过了数据文件.它应该加速,因为两个文件只扫描一次.


Rav*_*h13 2

以下内容awk可能会对您有所帮助。

awk '
FNR==NR{
  sub(/ +$/,"");
  a[$1]=$2;
  next
}
(substr($0,11,10) in a){
  print substr($0,1,10) a[substr($0,11,10)] substr($0,21)
}
' FS=", " encrypted_contact_number.txt students.txt
Run Code Online (Sandbox Code Playgroud)

输出如下。很快就会添加解释。

10000000011122334455XXX...
10000000024466742178YYY...
Run Code Online (Sandbox Code Playgroud)