두 목록을 비교하고 목록 1의 차이점 출력을 인쇄하고 싶습니다.

두 목록을 비교하고 목록 1의 차이점 출력을 인쇄하고 싶습니다.

두 가지 변수 입력이 있습니다.

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쉘을 혼동하지 않습니다. 또한 2차 시간에서는 매우 비효율적으로 실행되지만 문제가 되지 않을 수도 있습니다.

더 빠르게, 사용하세요연관 배열:

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

관련 정보