我想比较两个列表并打印列表一的差异输出

我想比较两个列表并打印列表一的差异输出

我有两个变量输入:

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

输出:我想要如下输出:(从$VAR2in 中删除常见的$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,将其与每个jin进行比较VAR2。如果未找到匹配项,则添加i到输出。

这个版本假设了字符,VAR1并且VAR2不会混淆 shell。此外,它在二次时间中运行效率很低,但这也许不是问题。

更快,使用关联数组

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

相关内容