我得到两个文件:大约1万行的file1和几百行的file2。我想检查file2的所有行是否都出现在file1中。即:∀行ℓ∈file2:∀∈file1
任何人都不应该知道这些符号是什么意思,或者“检查file2的所有行是否在file1中出现”的含义是:两个文件中的几个等效行都不影响检查是否返回文件满足要求。
我该怎么做呢?
我得到两个文件:大约1万行的file1和几百行的file2。我想检查file2的所有行是否都出现在file1中。即:∀行ℓ∈file2:∀∈file1
任何人都不应该知道这些符号是什么意思,或者“检查file2的所有行是否在file1中出现”的含义是:两个文件中的几个等效行都不影响检查是否返回文件满足要求。
我该怎么做呢?
Answers:
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)
-u
添加到sort
命令中的选项。现在,两个排序文件中只剩下唯一的行。
<
管道输入标准输入。括号项会改变这一点吗?
file_1
预分类的形式存储。节省打字和时间。
awk
在确实支持特定length(array)
功能(以及其他awk
可能支持的其他实现)的地方使用GNU ,如果文件已排序,则不需要。
gawk 'FNR==NR{seen[$0];next} ($0 in seen){delete seen[$0]};
END{print (!length(seen))?"Matched":"Not Matched"}' file2 file1
这会将file2读入一个seen
以key作为file2整行的数组。
然后读取file1,如果每行与看到的数组中的行匹配,则删除该键。
最后,如果数组为空,则表示file2中的所有行都在file1中并且将打印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
若要仅在file2中忽略空行或带有空格的行,则需要添加NF
条件,NR==FNR && NF {...
以跳过将其读入数组的操作。
length(array)
仅适用于gawk的AFAIK;绝对不是POSIX。
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
使用Python程序:
#!/usr/bin/env python3
import sys
def open_arg(path):
return sys.stdin if path == '-' else open(path)
def strip_linebreak(s):
return s[:-1] if s.endswith('\n') else s
with open_arg(sys.argv[1]) as pattern_file:
patterns = set(map(strip_linebreak, pattern_file))
with open_arg(sys.argv[2]) as dataset_file:
for l in map(strip_linebreak, dataset_file):
patterns.remove(l)
if not patterns:
break
sys.exit(int(bool(patterns)))
用法:
python3 contains-all.py file2 file1
程序退出状态指示文件2的所有模式是否都匹配:
要查询在shell(脚本)的退出状态,你可以使用$?
特殊的变量或计算结果命令的退出状态其他表达式,如短路运营商&&
和||
和条件表达式像if
或while
。例:
if python3 compare-all.py file2 file1 && some-other --condition; then
# do stuff
fi
file2
包含2行A
,您是否需要file1
至少包含2行A
?