如何将一个文件与linux中的一堆文件进行比较

时间:2014-12-10 15:44:45

标签: linux awk

我有一个文件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

1 个答案:

答案 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文件中的元素,因此我们可以循环并打印出来。

相关问题