所以我想把一个文本文件的内容从另一个文本文件中去掉,但是在非常大的数据集上
文件1:

ligand1
ligand6
ligand9
ligand4

文件2:
ligand1
ligand9

输出文件
ligand6
ligand4

我一直在用这个grep -v -x -f file1.txt file2.txt > new_file.txt
但在大数据集上它崩溃了

最佳答案

您可以使用一个简单的awk逻辑:

$ awk 'NR==FNR{list[$0];next} !($0 in list)' file_2 <(tr -d ' ' <file_1)
ligand6
ligand4

然后可以将其写入某个临时路径中的文件,例如。
awk 'NR==FNR{list[$0];next} !($0 in list)' file_2 <(tr -d ' ' <file_1) > /tmp/newFile

文件1上的tr命令去除导致awk替换的前导空格
逻辑很简单:
FNRNR跟踪每个文件中的行,因此当使用多个文件时,NR在文件之间保持活动状态,并在单个文件之后重置(如果第一个输入有5行,第二个输入有10行,则FNR将是1,2,3…15,NR将是1…5,然后是1…1)
FNRNR==FNR意味着,这部分代码只适用于文件2,即基本上文件2的所有内容都复制到名为nextawk数组中。
list然后对文件1应用操作,该文件将只打印文件2中不存在的行。就是这样!
注意:-如果多余的前导空格是意外的,并且被删除,那么总体的命令性能可能会更快一些,因为现在这会为每一行删除空格。

10-07 19:32
查看更多