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 ......
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)
没有测试,因为你错过了数据文件.它应该加速,因为两个文件只扫描一次.
以下内容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)