linux - 删除基于一个文件的行包含到另一个
问题描述
我正在尝试找到一种方法来加快删除过程。
目前我有两个文件,file1.txt 和 file2.txt
file1 包含 10000 行附近的 20 位记录。file2 包含 6500 位的长度记录,接近 200 万。
我的目标是删除 file2 上与 file1 上的记录匹配的行。
为此,我使用第一个文件中的记录行创建一个 sed 文件,如下所示:
文件1:
/^20606516000100070004/d /^20630555000100030001/d /^20636222000800050001/d
使用的命令: sed -i -f file1 file2
该命令工作正常,但删除 file2 上的 10 000 行大约需要 4 小时。
我正在寻找一种可以加快删除过程的解决方案。
附加信息:
file1 的每条记录肯定在 file2 上!file2 中的行总是以 20 位数字开头,这些数字应该与 file1 中包含的记录匹配或不匹配。
为了说明上面的点是来自file2的一行(这不是整行,因为解释文件2的每条记录是6500长度)
20606516000100070004 XXXXXXX19.202107.04.202105.03.202101.11.202001.11.2020WWREABBXBOU
提前致谢。
解决方案
你所需要的就是这个,在每个 Unix 机器上的任何 shell 中使用任何 awk:
awk 'NR==FNR{a[$0]; next} !(substr($0,1,20) in a)' file1 file2
并且使用您在合理处理器上描述的文件,它将在几秒钟内而不是 4 小时内运行。
只需确保file1
仅包含您要匹配的数字,而不是使用这些数字的 sed 脚本,例如:
$ head file?
==> file1 <==
20606516000100070004
20630555000100030001
20636222000800050001
==> file2 <==
20606516000100070004XXXXXXX19.202107.04.202105.03.202101.11.202001.11.2020WWREABBXBOU
99906516000100070004XXXXXXX19.202107.04.202105.03.202101.11.202001.11.2020WWREABBXBOU
$ awk 'NR==FNR{a[$0]; next} !(substr($0,1,20) in a)' file1 file2
99906516000100070004XXXXXXX19.202107.04.202105.03.202101.11.202001.11.2020WWREABBXBOU
推荐阅读
- javascript - 使用 JavaScript 在 URL 中添加 GET 参数
- c++ - 将对象插入 std::map 时构造函数中的变量地址
- realm - Realm db 的撤消管理
- .net - 如何为 ARM 平台构建 Tizen C# .NET Wearable TPK 并发布到三星卖家门户?
- javascript - 在 dataLoader amchart v3 中循环
- java - 有没有办法根据给定的字符串设置实例的成员变量?
- firebase - Flutter Cloud Firestore 仅在调试时获取最新数据
- c - 如何订购相互依赖的功能?
- javascript - 将“keydown”事件侦听器添加到文档中,输入字段除外
- javascript - 如何在 expressjs 中调用多个文件 .pug?