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を一時変数として指定しました。
以下の1つのライナースクリプト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