Como encontrar a diferença de tokens em duas strings usando ferramentas Unix?

Como encontrar a diferença de tokens em duas strings usando ferramentas Unix?

Eu tenho duas strings como abaixo-

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

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

Visualmente, posso ver que "tokens" gostam token1e token7não estão presentes em ambas as strings. Mas existe uma maneira fácil de obter tokens diferentes usando ferramentas Unix?

O caminho mais longo seria escrever um script e manter um hashmap de {token => count} e no final imprimir apenas as chaves que possuem count = 1. Mas suponho que exista um caminho mais curto.

Responder1

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)

Dá:

token1
                token10
                token2
                token3
                token4
                token5
                token6
        token7
                token8
                token9

As colunas são:

  1. tokens apenas em s1
  2. tokens apenas em s2
  3. tokens em ambos.

Você suprime uma coluna passando a opção correspondente (como -3suprimir a terceira coluna).

Responder2

Aproveitando a ideia básica de Ramesh

Com o GNU awkembash

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

Responder3

Você pode fazer algo como abaixo.

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

Explicação

Estou mesclando os 2 arquivos em outro arquivo e dividindo os tokens com vírgula como delimitador. Depois disso, estou imprimindo apenas os valores que são únicos (ou seja, apenas os valores que ocorrem uma vez, o que acredito ser o que você está procurando).

conteúdo do arquivo input1

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

conteúdo do arquivo input2

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

Depois de executar o script acima, recebo a saída como,

token1 token10 token2 token3 token4 token5 token6 token7 token8 token9

Se você observar a saída acima, ela imprimirá apenas os valores exclusivos de ambos os arquivos.

No entanto, se você precisar apenas da diferença, poderá usar o comando abaixo.

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

informação relacionada