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