Unix命令查找字符串集交点或异常值? 是否存在与相同的UNIX命令? sort | uniq

Unix命令查找字符串集交点或异常值? 是否存在与相同的UNIX命令? sort | uniq,unix,grep,set,Unix,Grep,Set,查找字符串集交点或“异常值” 一个示例应用程序:我有一个html模板列表,其中一些有{%load i18n%}字符串,其他没有。我想知道哪些文件没有 编辑:grep-L解决了上述问题 这个怎么样: 文件1: mom dad bob 文件2: dad %相交文件1文件2 dad mom bob %左唯一文件1文件2 dad mom bob 也许我误解了这个问题,但是为什么不使用grep来查找字符串(使用-L选项让它打印没有字符串的文件名) 换句话说 grep -L "{% load i

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

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

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

这个怎么样:

文件1:

mom
dad
bob
文件2:

dad
%相交文件1文件2

dad
mom
bob
%左唯一文件1文件2

dad
mom
bob

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

换句话说

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

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

来自man
grep

-L, --files-without-match
抑制正常输出;而是打印 从中获取的每个输入文件的名称 通常不会有输出 印刷的。扫描将停止 第一场比赛

因此,如果您的模板是所需的.html文件:

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

# sort file1 file2 | uniq -d
dad
左唯一:

# sort file1 file2 | uniq -u
bob
mom

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

$ comm -12 file1 file2
将生成两个文件共有的单词。更一般地说,给定已排序的输入文件
file1
file2
,命令

$ comm file1 file2
生成三列输出

  • 仅文件1中的行
  • 仅文件2中的行
  • 文件1和文件2中的行
  • 您可以使用
    -N
    选项抑制输出中的列
    N
    。因此,上面的命令comm-12file1file2将取消第1列和第2列,只保留两个文件共有的单词。

    来自:

    两个(未排序)文件之间的交集:

    文件2中不在文件1中的行:

    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特有的行
    交叉口:

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

    comm-12为了更快地搜索,我也会使用-F,因为它只是一个固定的字符串。那么设置交叉点呢?在比较之前不要忘记对文件进行排序。是的,结果让我大吃一惊。我确实在上面提到过,每个文件都包含一个“已排序的单词列表”,但它可能不会直接跳到您的面前。intersect有效,但left unique无效。它显示整个集合中的唯一值,而不是第一个集合中唯一的值。