두 변수에서 중복 단어 제거

두 변수에서 중복 단어 제거

VAR1에 표시 되고 에도 표시되는 모든 단어를 제거하고 싶습니다 VAR2.

예를 들어:

VAR1=a2,a3,a4,a5,a6,a1
VAR2=a1,a2,a6,a4,a7,a8

내가 원하는 결과는 다음과 같습니다.

VAR1=a3,a5
VAR2=a7,a8

답변1

에서는 zsh배열 빼기 연산자를 사용할 수 있습니다.

$ VAR1=a2,a3,a4,a5,a6,a1
$ VAR2=a1,a2,a6,a4,a7,a8
$ array1=(${(s:,:)VAR1})
$ array2=(${(s:,:)VAR2})
$ echo ${(j:,:)array1:|array2}
a3,a5
$ echo ${(j:,:)array2:|array1}
a7,a8

답변2

확장하다tr+sort+paste+comm해결책:

VAR1="a2,a3,a4,a5,a6,a1"
VAR2="a1,a2,a6,a4,a7,a8"
temp1="$VAR1"
temp2="$VAR2"

VAR1=$(comm -23 <(tr ',' '\n' <<<"$temp1" | sort) <(tr ',' '\n' <<<"$temp2" | sort) | paste -d',' -s)
VAR2=$(comm -13 <(tr ',' '\n' <<<"$temp1" | sort) <(tr ',' '\n' <<<"$temp2" | sort) | paste -d',' -s)

결과:

$ echo "$VAR1"
a3,a5

$ echo "$VAR2"
a7,a8

답변3

아래 스크립트에서는 tmp1=$VAR1 및 tmp2=$VAR2를 임시 변수로 지정했습니다.

아래 하나의 라이너 스크립트 awk가 테스트되었으며 잘 작동합니다.

tmp1=$VAR1;tmp2=$VAR2

 VAR1=$(awk 'NR==FNR {a[$1];next}!($1 in a) {print $1}' <(echo $tmp2|perl -pne "s/,/\n/g") <(echo $tmp1|perl -pne "s/,/\n/g")|perl -pne "s/\n/,/g"| sed "s/,$//g")



VAR2=$(awk 'NR==FNR {a[$1];next}!($1 in a) {print $1}' <(echo $tmp1|perl -pne "s/,/\n/g") <(echo $tmp2|perl -pne "s/,/\n/g")|perl -pne "s/\n/,/g"| sed "s/,$//g")

산출

echo $VAR1

a3,a5

echo $VAR2

a7,a8

답변4

Jeff의 답변과 비슷한 접근 방식이지만 Perl을 사용합니다.

source <(
    perl -se '
        @v1 = split /,/, $v1;
        @v2 = split /,/, $v2;
        @h1{@v1} = (1) x @v1; delete @h1{@v2};
        @h2{@v2} = (1) x @v2; delete @h2{@v1};
        printf qq{VAR1only="%s"\n}, join ",", keys %h1;
        printf qq{VAR2only="%s"\n}, join ",", keys %h2;
    ' -- -v1="$VAR1" -v2="$VAR2"
)

echo "$VAR1only -- $VAR2only"
a3,a5 -- a7,a8

관련 정보