
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 token1
e token7
nã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:
- tokens apenas em s1
- tokens apenas em s2
- tokens em ambos.
Você suprime uma coluna passando a opção correspondente (como -3
suprimir a terceira coluna).
Responder2
Aproveitando a ideia básica de Ramesh
Com o GNU awk
embash
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