Bash中两个列表的交集

我想写一个简单的脚本,将列出两个列表中find的内容。 为了简化,我们以ls为例。 想象一下,“一”和“二”是目录。

一个='一个'
两个=“两个”
十字路口$一两美元

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

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

使用comm命令:

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

“sorting”并不是真的需要,但是为了以防万一,我在使用“comm”之前总是join它。

comm解决scheme

comm是伟大的,但确实需要使用sorting列表。 幸运的是,我们使用了ls Bash手册页中的ls

如果没有-cftuSUX和–sort,则按字母顺序对条目进行sorting。

 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} 

效率较低(比通讯)的select:

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

join是另一个很好的select,取决于input和期望的输出

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

还有另一个Stackoverflow问题“在bash中的数组相交”,它被标记为这个的重复。 在我看来,这个问题并不完全一样,因为这个问题是关于比较两个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实用程序执行字母数字sorting,而“bash中的数组相交”答案使用数字; 因此“sorting”和“sorting-g”的用法。