Eu quero comparar duas listas e imprimir a saída da diferença da lista um

2

Eu tenho duas variáveis entrada:

VAR1="abc red blue cat empty dummy rummy"
VAR2="rummy zero empty rat cat reverse"

saída: Eu quero saída como segue: (remova os comuns de $VAR2 in $VAR1 )

abc red blue dummy

Eu tentei o seguinte:

for i in $VAR1
do
        for j in $VAR2
        do
                if [ $i != $j ]; then
                        echo $i;
                fi
        done
done

Aqui, if [ $i == $j ]; then echo $i , aqui saio perfeitamente como cat empty rummy Mas eu preciso obter uma saída diferente dessas.

    
por Kasino 05.08.2016 / 19:31

1 resposta

2

Tente:

    a=()
    for i in $VAR1; do
        found=
        for j in $VAR2; do
            if [ $i == $j ]; then
                found=1
                break
            fi
        done
        if [ ! $found ]; then
            a+=($i)
        fi
    done
    echo ${a[*]}

Em palavras: para cada i em VAR1 , compare-a com todos os j em VAR2 . Se nenhuma correspondência for encontrada, adicione i à saída.

Esta versão está assumindo que os caracteres em VAR1 e VAR2 não estarão confundindo o shell. Além disso, é ineficiente em execução em tempo quadrático, mas talvez isso não seja uma preocupação.

Mais rápido, usando matrizes associativas :

declare -A a2
for k in $VAR2; do
    a2[$k]=1
done
for k in $VAR1; do
    if [ ! "${a2[$k]}" ]; then
        echo $k
    fi
done
    
por 05.08.2016 / 20:17