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

0

Eu tenho duas sequências abaixo:

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

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

Visualmente, vejo que "tokens", como token1 e token7 , não estão presentes em ambas as sequências. Mas existe uma maneira fácil de obter os diferentes tokens usando ferramentas Unix?

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

    
por Wes 27.03.2014 / 21:46

3 respostas

2

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 -3 para suprimir a terceira coluna).

    
por 27.03.2014 / 22:28
1

Apertando a ideia básica de Ramesh

Com o% GNUawk em bash

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
    
por 27.03.2014 / 22:25
1

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 juntando os 2 arquivos em outro arquivo e dividindo os tokens com vírgula como um delimitador. Depois disso, estou imprimindo apenas os valores que são únicos (significando 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.

Se você, no entanto, precisar da diferença sozinho, poderá usar o comando abaixo.

echo ${arr[@]} | sort | uniq -c
    
por 27.03.2014 / 22:13