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