检查文件的所有行是否出现在不同的文件中

检查文件的所有行是否出现在不同的文件中

我有两个文件:file1 有大约 10 000 行,file2 有几百行。我想检查 file2 的所有行是否都出现在 file1 中。即: ∀ 行 ℓ ∈ file2 : ℓ ∈ file1

如果有人不知道这些符号的含义或“检查 file2 的所有行是否都出现在 file1 中”的含义:任一文件中的几个等效行不会影响检查是否返回文件满足要求。

我该怎么做呢?

答案1

comm -13 <(sort -u file_1) <(sort -u file_2)

该命令将输出file_2.因此,如果输出为空,则所有file_2行都包含在file_1.

来自通讯员:

   With  no  options,  produce  three-column  output.  Column one contains
   lines unique to FILE1, column two contains lines unique to  FILE2,  and
   column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)

答案2

[ $(grep -cxFf file2 <(sort -u file1)) = $(sort -u file2 | wc -l) ] && 
  echo all there || 
  echo some missing

如果 file1(的唯一行)中 file2 的匹配数与 file2 中的唯一行数相同,则它们都在那里;否则,他们就不是。

答案3

使用 GNU awk,它确实支持特定功能(以及可能支持的length(array)其他一些实现),并且如果文件已排序则不需要。awk

gawk 'FNR==NR{seen[$0];next} ($0 in seen){delete seen[$0]};
    END{print (!length(seen))?"Matched":"Not Matched"}' file2 file1

这是读书文件2放入一个名为seen用键作为整行调用文件2

然后阅读文件1对于每一行,如果与所看到的数组中的行匹配,则删除该键。

最后如果数组为空意味着所有行文件2存在于文件1并将打印Matched,否则会显示Not Matched


为了所有实现的兼容性awk

awk 'FNR==NR{seen[$0];next} ($0 in seen){delete seen[$0]};
    END{for(x in seen);print (!x)?"Matched":"Not Matched"}' file2 file1

仅当在时才忽略空行/或带有空格的行文件2,您需要添加NF条件 inNR==FNR && NF {...以跳过将它们读入数组。

答案4

diff -q <(sort -u file2) <(grep -Fxf file2 file1 | sort -u)

file1如果包含,将不产生输出所有的线进入file2并退出状态0,否则会打印类似的内容

Files /proc/self/fd/11 and /proc/self/fd/12 differ

并退出状态1

相关内容