我有一个文件A,如下所示:
file A
chr1 123 aa b c d
chr1 234 a b c d
chr1 345 aa b c d
chr1 456 a b c d
....
我有一堆类似的文件,在dirB中有类似的列,我必须比较文件A.
为此,我使用cat将dirB中的所有文件连接到一个名为fileB的文件中,然后根据键列1和2比较两个文件,如下所示:
awk 'FNR==NR{a[$1,$2]++;next}!a[$1,$2]' fileB fileA
此命令使用第1列和第2列作为键,并给出仅在fileA中具有键的行。
然而,问题在于,当存在大量文件时,fileB在空间和内存方面要处理得很大。
有人可以建议替代方案,以便它跳过连接所有文件以创建fileB的步骤。相反,fileA可以直接与dirB
中的所有文件进行比较chr1 123 aa b c d xxxx abcd
chr1 234 a b c d
chr1 345 aa b c d yyyy defg
chr1 456 a b c d
答案 0 :(得分:1)
也许是这些方面的事情:
awk 'NR == FNR { a[$1,$2] = $0; next }
{ delete a[$1, $2] }
END { for (i in a) print a[i] }
' a.txt b1.txt b2.txt ...
从文件A开始,将每个键添加到一个数组,其中包含值的行内容。然后对于所有B文件,使用匹配的键删除数组中的所有元素。最后剩下的任何元素都是A中不存在于任何B文件中的元素,因此我们可以循环并打印出来。