代码之家  ›  专栏  ›  技术社区  ›  Evgeny

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

  •  17
  • Evgeny  · 技术社区  · 16 年前

    是否有一个与之相当的unix命令

    sort | uniq
    

    查找字符串集交集或“离群值”。

    一个示例应用程序:我有一个HTML模板列表,其中一些模板内有%加载I18n%字符串,其他模板内没有。我想知道哪些文件没有。

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

    这个怎么样?

    文件1:

    mom
    dad
    bob
    

    文件2:

    dad
    

    %相交文件1文件2

    爸爸
    

    %左唯一文件1文件2

    mom
    bob
    
    6 回复  |  直到 7 年前
        1
  •  33
  •   Dale Hagglund    16 年前

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

    $ comm -12 file1 file2
    

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

    $ comm file1 file2
    

    生成三列输出

    1. 仅文件1中的行
    2. 仅文件2中的行
    3. 文件1和文件2中的行

    可以取消该列 N 在输出中 -N 选择权。所以,上面的命令, comm -12 file1 file2 ,取消显示第1列和第2列,只保留两个文件共用的单词。

        2
  •  8
  •   John Kugelman Michael Hodel    16 年前

    横断:

    # sort file1 file2 | uniq -d
    dad
    

    左独特:

    # sort file1 file2 | uniq -u
    bob
    mom
    
        3
  •  5
  •   Tyler McHenry    16 年前

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

    换言之

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

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

        4
  •  4
  •   itsadok    13 年前

    http://www.commandlinefu.com/commands/view/5710/intersection-between-two-files :

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

    grep -Fx -f file1 file2
    

    文件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只显示 非匹配 行,提供文件2特有的行。
        5
  •  2
  •   artlung    16 年前

    从人 grep

    -L, --files-without-match
    

    禁止正常输出;改为打印 每个输入文件的名称,其中 通常不会有输出 印刷的。扫描将停止 第一场比赛。

    因此,如果模板是.html文件,则需要:

    grep -L '{% load i18n %}' *.html
    
        6
  •  1
  •   Uri Ziv    7 年前

    交叉:

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

    所有行由3列组成(file1 file2交集):

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

    如果文件未排序和/或其中一个文件中可能有重复的行,但另一个文件中没有显示这些行-此单行命令将对文件进行排序,删除重复的行,您将直接获得所需的结果。