
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 token1
y token7
no 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:
- tokens solo en s1
- tokens solo en s2
- fichas en ambos.
Suprime una columna pasando la opción correspondiente (como -3
suprimir la tercera columna).
Respuesta2
Pellizcando la idea básica de Ramesh
Con GNU awk
enbash
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