Esta questão está fortemente relacionada a esta e a esta pergunta. Eu tenho um arquivo que contém várias linhas onde cada linha é o caminho para um arquivo. Agora eu quero parear cada linha com cada linha diferente (não ela mesma). Além disso, um par A B
é igual a um B A
par para meus propósitos, portanto apenas uma dessas combinações deve ser produzida.
Exemplo
files.dat
lê assim em uma notação abreviada, cada letra é um caminho de arquivo (absoluto ou relativo)
a
b
c
d
e
Então meu resultado deve ser algo como isto:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
De preferência, eu gostaria de resolver isso no bash. Diferentemente das outras perguntas, minha lista de arquivos é bastante pequena (cerca de 200 linhas), portanto, usar loops e capacidade de RAM não apresenta problemas.
Respostas:
Use este comando:
PROCINFO
pode ser umagawk
extensão. Se o seuawk
não suportar, deixe de fora aPROCINFO["sorted_in"] = "@ind_str_asc"
linha e canalize a saídasort
(se desejar que a saída seja classificada).(Isso não requer que a entrada seja classificada.)
fonte
Isso pressupõe que nenhuma linha no arquivo de entrada contenha espaço em branco. Ele também assume que o arquivo está classificado .
O
join
comando cria o produto cruzado completo das linhas no arquivo. Isso é feito juntando o arquivo a si próprio em um campo inexistente. O não padrão-j 2
pode ser substituído por-1 2 -2 2
(mas não por, a-j2
menos que você use o GNUjoin
).O
awk
comando lê o resultado disso e apenas gera resultados que são pares que ainda não foram vistos.fonte
sort -b
iria classificá-lo.join
requer arquivos de entrada classificados.Uma
python
solução O arquivo de entrada é alimentado aitertools.combinations
partir da biblioteca padrão, que gera tuplas de 2 tamanhos que são formatadas e impressas na saída padrão.fonte
Se você
ruby
instalou:-0777
engolir o arquivo inteiro (deve ser bom, pois é mencionado no OP que o tamanho do arquivo é pequeno)-F'\n'
dividido com base na nova linha, para que cada linha seja um elemento na$F
matriz$F.combination(2)
gerar2
elementos de combinações por vez{ |c| puts c.join(" ")}
imprima conforme necessário$F.uniq.combination(2)
para 3 elementos por vez:
Com
perl
(não genérico)Com
awk
fonte
Aqui está um em casca pura.
Exemplo:
fonte
<file.dat xargs test.sh
quetest.sh $(cat file.dat)
Usando
Perl
podemos fazê-lo como mostrado:fonte