是否有一个 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

生成三列输出

  1. 仅在file1中的行
  2. 仅限于file2
  3. 文件1和文件2中的
  4. 您可以使用 -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)

如果您的文件没有排序和/或某个文件中可能有重复的行但是没有出现在另一个文件中 - 这个单行命令会对您的文件进行排序,删除重复的行你将直接得到你想要的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top