Se eu tiver n arquivos em um diretório, por exemplo;
a
b
c
Como faço para obter combinações de pares desses arquivos (não direcionais) para passar para uma função?
A saída esperada é
a-b
a-c
b-c
para que possa ser passado para uma função como
fn -file1 a -file2 b
fn -file1 a -file2 c
...
Isso é o que estou experimentando agora.
for i in *.txt
do
for j in *.txt
do
if [ "$i" != "$j" ]
then
echo "Pairs $i and $j"
fi
done
done
Resultado
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
Ainda tenho duplicatas (ab é o mesmo que ba) e estou pensando que talvez haja uma maneira melhor de fazer isso.
Coloque os nomes dos arquivos em uma matriz e execute-os manualmente com dois loops.
Você obtém cada pareamento apenas uma vez se j < i onde i e j são os índices usados no loop externo e interno, respectivamente.
Você está muito próximo em seu script, mas deseja remover duplicatas; ou seja, ab é considerado uma duplicata de ba.
Podemos usar uma desigualdade para lidar com isso; somente exibirá o nome do arquivo se o primeiro arquivo vier antes do segundo arquivo em ordem alfabética. Isso garantirá apenas uma de cada partidas.
Isso dá a saída
Este não é um algoritmo eficiente (é O(n^2)), mas pode ser bom o suficiente para suas necessidades.
Com
join
truque para nomes de arquivos sem espaços em branco:Exemplo de lista de arquivos:
-j
opção aponta para uma posição de campo comum para se juntar; mas-j9999
provocará a junção mista semelhante ao produto cartesiano .