用于查找字符串集交集或异常值的Unix命令?

时间:2009-06-19 03:37:35

标签: unix grep set

是否有与

相同的UNIX命令
sort | uniq

找到字符串集交叉点或“异常值”。

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

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

这个怎么样:

文件1:

mom
dad
bob

file2的:

dad

%与file1 file2相交

dad

%left-unique file1 file2

mom
bob

6 个答案:

答案 0 :(得分:36)

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

$ comm -12 file1 file2

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

$ comm file1 file2

生成三列输出

  1. 仅在file1中的行
  2. 仅限于file2
  3. 文件1和文件2中的
  4. 您可以使用N选项取消输出中的列-N。因此,上面的命令comm -12 file1 file2会抑制第1列和第2列,只留下两个文件共有的字。

答案 1 :(得分:9)

相交:

# sort file1 file2 | uniq -d
dad

左边唯一:

# sort file1 file2 | uniq -u
bob
mom

答案 2 :(得分:5)

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

换句话说

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

或适当的文件名通配符。

答案 3 :(得分:4)

来自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,< / LI>
  • -x选项告诉grep进行整行搜索,以便file1中的“foo”与file2中的“foobar”不匹配。
  • 默认情况下,grep将仅显示匹配的行,为您提供交集。 -v选项告诉grep只显示不匹配的行,为您提供file2独有的行。

答案 4 :(得分:2)

来自人grep

-L, --files-without-match
  

抑制正常输出;而是打印   每个输入文件的名称   通常没有输出   打印。扫描将停止   第一场比赛。

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

grep -L '{% load i18n %}' *.html

答案 5 :(得分:1)

路口:

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

所有行按3列(file1 | file2 | intersection):

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

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

相关问题