bash中两个列表的交集

我正在尝试编写一个简单的脚本,它将列出在两个列表中找到的内容。为了简化,让我们以LS为例。想象";一个";和“二”是目录。

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

我在Bash中仍然很生疏,所以请随时纠正我的做法。我只需要一些命令,将打印出所有文件";一";和“二”。它们必须同时存在于两者之中。您可以将其称为“交集”。在";一";之间和";二";。

81990 次浏览

使用comm命令:

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

排序";实际上并不需要,但我总是在使用";Comm";之前包含它以防万一。

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

效率较低(与Comm相比)的替代方案:

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

__溶液ABC0

comm是伟大的,但它确实需要与排序列表工作。幸运的是,这里我们使用ls,它来自__abc1 bash手册页

如果既没有-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}

根据输入和所需的输出,加入是另一个不错的选择。

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