informatica Intersecção de duas listas no Bash



bash personagem (5)

Use o comando comm :

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

"classificar" não é realmente necessário, mas eu sempre incluí-lo antes de usar "comm" apenas no caso.

Estou tentando escrever um script simples que listará o conteúdo encontrado em duas listas. Para simplificar, vamos usar ls como exemplo. Imagine "um" e "dois" são diretórios.

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

Eu ainda sou bastante verde no bash, então sinta-se livre para corrigir como estou fazendo isso. Eu só preciso de algum comando que irá imprimir todos os arquivos em "um" e "dois". Eles devem existir em ambos. Você pode chamar isso de "interseção" entre "um" e "dois".


Answer #1

Join é outra boa opção dependendo da entrada e saída desejada

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

Answer #2

Uma alternativa menos eficiente (que comm):

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

Answer #3
comm -12  <(ls 1) <(ls 2)

Answer #4

Há outra questão sobre o , "Array interseção no bash", que é marcada como uma duplicata disso. Não é exatamente o mesmo, na minha opinião, como essa pergunta fala sobre a comparação de dois arrays bash, enquanto esta questão se concentra em arquivos bash. Uma resposta de uma linha à outra questão, que agora está encerrada, é a seguinte:

# 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

O utilitário comm faz uma classificação alfanumérica, enquanto o "Array interseção in bash" atende números de uso; daí o uso de "sort" e "sort -g".





bash