Bash中两个列表的交集

时间:2010-04-23 03:37:15

标签: bash

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

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

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

6 个答案:

答案 0 :(得分:235)

comm -12  <(ls 1) <(ls 2)

答案 1 :(得分:44)

comm

的解决方案

comm很棒,但确实需要使用排序列表。幸运的是,我们在ls Bash手册页

中使用了ls
  

如果没有-cftuSUX或--sort。

,则按字母顺序对条目进行排序
comm -12  <(ls one) <(ls two)

替代sort

两个清单的交叉点:

sort <(ls one) <(ls two) | uniq -d

两个列表的对称差异:

sort <(ls one) <(ls two) | uniq -u

<强>加成

玩它;)

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

答案 2 :(得分:28)

使用comm命令:

ls one | sort > /tmp/one_list
ls two | sort > /tmp/two_list
comm -12 /tmp/one_list /tmp/two_list

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

答案 3 :(得分:3)

效率低于(通信)的替代方案:

cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d

答案 4 :(得分:2)

加入是另一个不错的选择,具体取决于输入和所需的输出

join -j1 -a1 <(ls 1) <(ls 2)

答案 5 :(得分:-2)

还有另一个Stackoverflow问题&#34; bash中的数组交集,&#34;这被标记为重复。在我看来,它并不完全相同,因为该问题涉及比较两个bash数组,而这个问题主要关注bash文件。现在关闭的另一个问题的单行答案如下:

# List1=( 0 1 2 3 4   6 7 8 9 10 11 12)
# List2=(   1 2 3   5 6   8 9    11 )
# List3=($(comm -12 <(echo ${List1[*]}| tr " " "\n"| sort) <(echo ${List2[*]} | tr " " "\n"| sort)| sort -g))
# echo ${List3[*]}
1 2 3 6 8 9 11

comm实用程序执行字母数字排序,而bash中的&#34;数组交集&#34;答案使用数字;因此&#34;排序&#34;和&#34;排序-g&#34;的使用。