【发布时间】:2018-07-02 16:18:29
【问题描述】:
我正在尝试使用 sed 脚本执行以下操作,但这需要太多时间。看起来我做错了什么。
场景:
我在students.txt 中有学生记录(> 100 万)。
在这个文件中(每行)前 10 个字符是学生证,接下来的 10 个字符是联系电话等等
students.txt
10000000019234567890XXX...
10000000029325788532YYY...
.
.
.
10010000008766443367ZZZZ...
我有另一个文件 (encrypted_contact_numbers.txt),其中包含除号码以外的所有电话以及相应的加密电话号码,如下所示
encrypted_contact_numbers.txt
Phone_Number、Encrypted_Phone_Number
9234567890, 1122334455
9325788532, 4466742178
.
.
.
8766443367, 2964267747
我想用encrypted_contact_numbers.txt中对应的加密电话号码替换students.txt中的所有联系号码(第11-20位)。
预期输出:
10000000011122334455XXX...
10000000024466742178YYY...
.
.
.
10010000002964267747ZZZZ...
我正在使用下面的 sed 脚本来执行此操作。它运行良好,但速度太慢。
方法一:
while read -r pattern replacement; do
sed -i "s/$pattern/$replacement/" students.txt
done < encrypted_contact_numbers.txt
方法2:
sed 's| *\([^ ]*\) *\([^ ]*\).*|s/\1/\2/g|' <encrypted_contact_numbers.txt |
sed -f- students.txt > outfile.txt
有什么方法可以快速处理这个巨大的文件?
更新:2018 年 2 月 9 日
如果电话号码在指定位置(第 10-20 列),AWK 和 Perl 中给出的解决方案工作正常,如果我尝试进行全局替换,则需要花费太多时间来处理。有没有最好的方法来实现这一点?
students.txt:更新版本
10000000019234567890XXX...9234567890
10000000029325788532YYY...
.
.
.
10010000008766443367ZZZZ9234567890...
【问题讨论】:
-
编辑问题以包含 sed 脚本。
-
除了约翰提到的,请在代码标签中添加您的 encrypted_contact_numbers.txt。
-
为了正确的格式,请在每行代码/数据/错误消息的前面使用4个空格或突出显示一个文本块并使用编辑左上角的
{}格式工具框格式为code/data/output/errorMsgs。有关详细信息,请参阅 editing-help 和 formatting。祝你好运。