题
是否有一个 UNIX 命令可以与
sort | uniq
查找字符串集交集或“异常值”。
一个示例应用程序:我有一个 html 模板列表,其中一些模板内部有 {% load i18n %} 字符串,其他模板则没有。我想知道哪些文件没有。
编辑: grep -L 解决了上述问题。
这个怎么样:
文件1:
mom
dad
bob
文件2:
dad
%与文件1文件2相交
dad
%left-唯一文件1 文件2
mom
bob
解决方案
似乎 grep -L
解决了海报的真正问题,但对于实际问题,找到两组字符串的交集,你可能想查看“comm” ;命令。例如,如果 file1
和 file2
每个都包含一个排序的单词列表,每行一个单词,那么
$ comm -12 file1 file2
将生成两个文件共有的单词。更一般地,给定排序的输入文件 file1
和 file2
,命令
$ comm file1 file2
生成三列输出
- 仅在file1中的行
- 仅限于file2 文件1和文件2中的
- 行 醇>
您可以使用 -N
选项禁止输出中的 N
列。因此,上面的命令 comm -12 file1 file2
会抑制第1列和第2列,只留下两个文件共有的字。
其他提示
相交:
# sort file1 file2 | uniq -d
dad
左边唯一:
# sort file1 file2 | uniq -u
bob
mom
也许我误解了这个问题,但为什么不使用grep来查找字符串(使用-L选项让它打印出没有字符串的文件的名称)。
换句话说
grep -L "{% load i18n %}" file1 file2 file3 ... etc
或适当的文件名通配符。
从 http://www.commandlinefu.com/commands/view/5710/intersection- Between-two-files:
两个(未排序)文件之间的交集:
grep -Fx -f file1 file2
file2 中不存在于 file1 中的行:
grep -Fxv -f file1 file2
解释:
- 这
-f
选项告诉 grep 从文件中读取要查找的模式。这意味着它会在 file2 中搜索 file1 中的每一行。 - 这
-F
选项告诉 grep 将搜索词视为固定字符串,而不是模式,以便a.c
只会匹配a.c
并不是abc
, - 这
-x
选项告诉 grep 进行整行搜索,以便 file1 中的“foo”不会匹配 file2 中的“foobar”。 - 默认情况下,grep 将仅显示匹配的行,从而给出交集。这
-v
选项告诉 grep 仅显示 不匹配 行,为您提供 file2 特有的行。
来自man grep
-L, --files-without-match
抑制正常输出;而是打印 每个输入文件的名称 通常没有输出 打印。扫描将停止 第一场比赛。
因此,如果您的模板是您想要的.html文件:
grep -L '{% load i18n %}' *.html
路口:
comm -12 <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)
所有行按3列(file1 | file2 | intersection):
comm <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)
如果您的文件没有排序和/或某个文件中可能有重复的行但是没有出现在另一个文件中 - 这个单行命令会对您的文件进行排序,删除重复的行你将直接得到你想要的结果。