Bash中两个列表的交集

Use*_*er1 153 bash

我正在尝试编写一个简单的脚本,列出两个列表中的内容.为简化起见,我们以ls为例.想象一下"一个"和"两个"是目录.

one=`ls one`
two=`ls two`
intersection $one $two

我在bash中仍然很绿,所以请随时纠正我这样做的方式.我只需要一些命令,打印出"one"和"two"中的所有文件.它们必须存在于两者中.你可以把它称为"一"和"两"之间的"交集".

gho*_*g74 261

comm -12  <(ls 1) <(ls 2)
Run Code Online (Sandbox Code Playgroud)

  • 直到今天,我无法相信我对'comm`一无所知.这只是我整个星期:) (33认同)
  • `comm`要求对输入进行排序.在这种情况下,`ls`会自动对其输出进行排序,但其他用途可能需要这样做:`comm -12 <(some-command | sort)<(some-other-command | sort)` (19认同)
  • 不要使用ls'输出任何东西.ls是用于交互式查看目录元数据的工具.任何使用代码解析ls'输出的尝试都会被破坏.Globs更加简单和正确:''for file in*.txt''.阅读http://mywiki.wooledge.org/ParsingLs (11认同)
  • 我只是用它来试图找到一个'public`方法`error()`的用法,由一个特性提供,与`git grep`结合使用,它真棒!我跑了`$ comm -12 <(git grep -il"\ $ this-> error(" - "*.php")<(git grep -il"Dash_Api_Json_Response" - "*.php")`,和幸运的是,我最终只得到了包含特征的文件名. (2认同)
  • 这真可笑.我试图用awk做一些疯狂的事情. (2认同)
  • 对于那些想知道 12 含义的人:-1 抑制第 1 列(FILE1 特有的行),-2 抑制第 2 列(FILE2 特有的行),-3 抑制第 3 列(两个文件中都出现的行) (2认同)

Jea*_*aud 52

解决方案 comm

comm很棒,但确实需要使用排序列表.幸运的是,我们在这里使用lslsBash手册页

如果没有-cftuSUX或--sort,则按字母顺序对条目进行排序.

comm -12  <(ls one) <(ls two)
Run Code Online (Sandbox Code Playgroud)

替代 sort

两个列表的交集:

sort <(ls one) <(ls two) | uniq -d
Run Code Online (Sandbox Code Playgroud)

两个列表的对称差异:

sort <(ls one) <(ls two) | uniq -u
Run Code Online (Sandbox Code Playgroud)

奖金

玩它;)

cd $(mktemp -d) && mkdir {one,two} && touch {one,two}/file_{1,2}{0..9} && touch two/file_3{0..9}
Run Code Online (Sandbox Code Playgroud)

  • 我认为不是“补码”,而是所谓的“对称差”。 (2认同)

DVK*_*DVK 28

使用comm命令:

ls one | sort > /tmp/one_list
ls two | sort > /tmp/two_list
comm -12 /tmp/one_list /tmp/two_list
Run Code Online (Sandbox Code Playgroud)

"sort"并不是真的需要,但我总是在使用"comm"之前将其包括在内以防万一.

  • 包含它是好的,因为它确实需要排序,他只使用ls作为例子. (4认同)