両方のリストを比較し、リスト1の違いの出力を印刷したいと思います。

両方のリストを比較し、リスト1の違いの出力を印刷したいと思います。

2つの変数入力があります。

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

出力:次の出力が必要です。 ($VAR2inからcommonを削除する$VAR1

abc red blue dummy

私は以下を試しました:

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

ここではif [ $i == $j ]; then echo $i完璧な出力を得ましたcat empty rummy が、これ以外の出力も得なければなりません。

ベストアンサー1

努力する:

    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[*]}

つまり、すべてのiinに対してVAR1すべてのinとj比較しますVAR2。一致するものがない場合は、i出力に追加します。

このバージョンは文字を想定し、VAR1シェルVAR2を混同しません。また、二次時間では非常に非効率的に実行されますが、問題にならない可能性があります。

より速く、使用してください連想配列:

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

おすすめ記事