21

是否有与 UNIX 命令相当的

sort | uniq

查找字符串集的交点或“异常值”。

一个示例应用程序:我有一个 html 模板列表,其中一些有 {% load i18n %} 字符串,其他没有。我想知道哪些文件没有。

编辑: grep -L 解决了上述问题。

这个怎么样:

文件1:

mom
dad
bob

文件2:

dad

% 相交文件 1 文件 2

dad

%left-unique file1 file2

mom
bob
4

6 回答 6

39

似乎grep -L解决了海报的真正问题,但对于提出的实际问题,找到两组字符串的交集,您可能需要查看“comm”命令。例如,如果file1file2each 包含一个排序的单词列表,每行一个单词,那么

$ comm -12 file1 file2

将产生两个文件共有的单词。更一般地说,给定排序的输入文件file1file2,命令

$ comm file1 file2

产生三列输出

  1. 仅在 file1 中的行
  2. 仅在 file2 中的行
  3. file1 和 file2 中的行

N您可以使用该-N选项抑制输出中的列。因此,上面的命令comm -12 file1 file2, 抑制了第 1 列和第 2 列,只留下两个文件共有的单词。

于 2009-06-19T05:07:15.813 回答
9

相交:

# sort file1 file2 | uniq -d
dad

左唯一:

# sort file1 file2 | uniq -u
bob
mom
于 2009-06-19T04:27:17.017 回答
7

来自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 从文件中读取要查找的模式。这意味着它为 file1 中的每一行执行 file2 搜索。
  • -F选项告诉 grep 将搜索词视为固定字符串,而不是模式,因此a.c只会匹配a.c而不匹配abc
  • -x选项告诉 grep 进行整行搜索,以便 file1 中的“foo”与 file2 中的“foobar”不匹配。
  • 默认情况下,grep 将只显示匹配的行,为您提供交集。该-v选项告诉 grep 只显示不匹配的行,为您提供 file2 独有的行。
于 2012-08-20T05:13:59.567 回答
5

也许我误解了这个问题,但为什么不只使用 grep 来查找字符串(使用 -L 选项让它打印其中没有字符串的文件的名称)。

换句话说

grep -L "{% load i18n %}" file1 file2 file3 ... etc

或根据需要为文件名使用通配符。

于 2009-06-19T03:40:15.587 回答
2

从男人grep

-L, --files-without-match

抑制正常输出;而是打印通常不会打印输出的每个输入文件的名称。扫描将在第一次匹配时停止。

因此,如果您的模板是您想要的 .html 文件:

grep -L '{% load i18n %}' *.html
于 2009-06-19T03:46:57.973 回答
2

路口:

comm -12 <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)

3 列的所有行(文件 1 | 文件 2 | 交集):

comm <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)

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

于 2018-05-22T12:34:20.947 回答