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”的用法。