¿Cómo encontrar la diferencia en tokens en dos cadenas usando herramientas Unix?

¿Cómo encontrar la diferencia en tokens en dos cadenas usando herramientas Unix?

Tengo dos cadenas como se muestra a continuación.

token1, token2, token3, token4, token5, token6, token8, token9, token10

token2, token7, token4, token3, token5, token6, token8, token10, token9

Visualmente, puedo ver que a los "tokens" les gustan token1y token7no están presentes en ambas cadenas. Pero, ¿existe una manera fácil de obtener los diferentes tokens utilizando herramientas Unix?

La ruta larga sería escribir un script y mantener un mapa hash de {token => count} y al final imprimir solo aquellas claves que tengan count = 1. Pero supongo que hay una manera más corta.

Respuesta1

GNUly:

s1='token1, token2, token3, token4, token5, token6, token8, token9, token10'
s2='token2, token7, token4, token3, token5, token6, token8, token10, token9'
comm <(grep -oE '\w+' <<< "$s1" | sort) <(grep -oE '\w+' <<< "$s2" | sort)

Da:

token1
                token10
                token2
                token3
                token4
                token5
                token6
        token7
                token8
                token9

Las columnas son:

  1. tokens solo en s1
  2. tokens solo en s2
  3. fichas en ambos.

Suprime una columna pasando la opción correspondiente (como -3suprimir la tercera columna).

Respuesta2

Pellizcando la idea básica de Ramesh

Con GNU awkenbash

awk -v RS='[[:space:]]*,[[:space:]]*' '{x[$0]++}; END{for (y in x) if (x[y] == 1) print y}'  
<(printf "%s" 'token1, token2, token3, token4, token5, token6, token8, token9, token10')  
<(printf "%s" 'token2, token7, token4, token3, token5, token6, token8, token10, token9')
token1
token7

Respuesta3

Puedes hacer algo como lo siguiente.

cat input1 input2 >> output
arr=$(cat output | tr "," "\n")
echo "${arr[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '

Explicación

Estoy fusionando los 2 archivos en otro archivo y dividiendo los tokens con una coma como delimitador. Después de eso, imprimo solo los valores que son únicos (es decir, solo los valores que ocurren una vez y creo que es lo que estás buscando).

contenido del archivo input1

token1, token2, token3, token4, token5, token6, token8, token9, token10

contenido del archivo input2

token2, token7, token4, token3, token5, token6, token8, token10, token9

Después de ejecutar el script anterior, obtengo el resultado como,

token1 token10 token2 token3 token4 token5 token6 token7 token8 token9

Si observa el resultado anterior, imprimirá solo los valores únicos de ambos archivos.

Sin embargo, si solo necesita la diferencia, puede usar el siguiente comando.

echo ${arr[@]} | sort | uniq -c

información relacionada