Existem muitas maneiras ...
-
Você pode usar
sort,truniqueepastee$()para executá-los e "transformar a saída em uma variável"#!/bin/bash var1="1, 2, 3, 4"; var2="3, 4, 5, 6" var3=$(echo " ${var1}, ${var2}" | tr ',' '\n' | sort | uniq -u | paste -sd,) echo $var31, 2, 5, 6Para cada um dos comandos anteriores, você pode ler mais com, por exemplo,
man sort -
Você pode transformar a variável nos arrays do bash e trabalhar neles (siga o seguinte apenas como uma dica, porque há um número incontável de maneiras de perceber isso ...)
#!/bin/bash#!/bin/bash var1="1, 2, 3, 4"; var2="3, 4, 5, 6" # here you transform the variable in array IFS=',' read -ra ADDR <<< "$var1" IFS=',' read -ra ADDR2 <<< "$var2" # then for each element in the 1st array you search if in the 2nd too SEP=""; var3="" for i in "${ADDR[@]}"; do Found=0 for j in "${ADDR2[@]}"; do [[ "$i" -eq "$j" ]] && Found=1 done [[ $Found == 0 ]] && { var3="$var3$SEP$i" ; SEP=", "; } done # then for each element in the 2nd array you search if in the 1st too for j in "${ADDR2[@]}"; do Found=0 for i in "${ADDR[@]}"; do [[ "$i" -eq "$j" ]] && Found=1 done [[ $Found == 0 ]] && { var3="$var3$SEP$j" ; SEP=", "; } done echo $var3 -
usando
awk(ou, para ser preciso,gawk)#!/bin/bash var1="1, 2, 3, 4"; var2="3, 4, 5, 6" var3=$(echo "$var1, $var2" | \ awk -F ',' '{for (i=1;i<=NF;i++) {A[$i]++;} } END{ SEP=""; for (i in A) {if (A[i]==1){ printf ("%s%s", SEP,i); SEP=", "} } }' ) echo $var3
Nota: a segunda e a terceira saída não são ordenadas ...
Notas atualizadas : ... e há um espaço antes de $var1 e $var2 porque no seu formato estranho ( :-) ) há espaços após a vírgula ( , ) então você precisa de cuidados especiais para todos os comandos que tomam apenas um caractere como separador ... isso corrige o problema se houver um , 1 na segunda string ... o que você não é capaz encontre com man <command> você pode tentar encontrar com man bash ou com help command ...
Ad nauseam :
-
diffstyle, no espírito da sua tentativa ... talvez você possa procurar um formato de saída mais aconchegante (man diff)diff --ignore-all-space \ <(echo "$var1" | tr ',' '\n' ) <(echo "$var2" | tr ',' '\n')\ | grep -v "^---" | grep -v "^[0-9c0-9]" | tr -d '<||>|| |' \ | paste -sd,