例如,如果我在一个目录中有 n 个文件;
a
b
c
如何获得这些文件的成对组合(非定向)以传递给函数?
预期的输出是
a-b
a-c
b-c
以便可以将其传递给类似的函数
fn -file1 a -file2 b
fn -file1 a -file2 c
...
这就是我现在正在尝试的。
for i in *.txt
do
for j in *.txt
do
if [ "$i" != "$j" ]
then
echo "Pairs $i and $j"
fi
done
done
输出
Pairs a.txt and b.txt
Pairs a.txt and c.txt
Pairs b.txt and a.txt
Pairs b.txt and c.txt
Pairs c.txt and a.txt
Pairs c.txt and b.txt
我仍然有重复项(ab 与 ba 相同),我在想也许有更好的方法来做到这一点。
将文件名放在一个数组中,并使用两个循环手动运行它。
如果j < i其中i和j分别是外部和内部循环中使用的索引,则每个配对只得到一次。
您的脚本非常接近,但您想删除重复项;即 ab 被认为是 ba 的副本。
我们可以使用不等式来处理这个问题;如果第一个文件按字母顺序排在第二个文件之前,则仅显示文件名。这将确保每个匹配项中只有一个。
这给出了输出
这不是一种有效的算法(它是 O(n^2)),但可能足以满足您的需求。
使用
join
没有空格的文件名技巧:文件示例列表:
-j
选项指向要加入的公共字段位置;但-j9999
会引发类似于笛卡尔积的混合连接。