首页 > 解决方案 > 删除基于一个文件的行包含到另一个

问题描述

我正在尝试找到一种方法来加快删除过程。

目前我有两个文件,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

提前致谢。

标签: linuxbashawksed

解决方案


你所需要的就是这个,在每个 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

推荐阅读