Как найти разницу токенов в двух строках с помощью инструментов Unix?

Как найти разницу токенов в двух строках с помощью инструментов Unix?

У меня есть две строки, как показано ниже:

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

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

Визуально я вижу, что "токены" типа token1и token7отсутствуют в обеих строках. Но есть ли простой способ получить отличающиеся токены с помощью инструментов Unix?

Долгий путь — написать скрипт и поддерживать хэш-карту {token => count}, а в итоге вывести только те ключи, у которых count = 1. Но я полагаю, что есть более короткий путь.

решение1

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)

Дает:

token1
                token10
                token2
                token3
                token4
                token5
                token6
        token7
                token8
                token9

Столбцы следующие:

  1. токены только в s1
  2. токены только в s2
  3. жетоны в обоих случаях.

Вы подавляете столбец, передавая соответствующую опцию (например, -3подавляете 3-й столбец).

решение2

Заимствование основной идеи у Рамеша

С GNU awkв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

решение3

Вы можете сделать что-то вроде этого.

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

Объяснение

Я объединяю 2 файла в один файл и разделяю токены запятой в качестве разделителя. После этого я печатаю только уникальные значения (то есть только значения, которые встречаются один раз, что, как я полагаю, вам и нужно).

содержимое файла input1

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

содержимое файла input2

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

После выполнения приведенного выше скрипта я получаю следующий вывод:

token1 token10 token2 token3 token4 token5 token6 token7 token8 token9

Если вы посмотрите на приведенный выше вывод, то увидите, что будут выведены только уникальные значения из обоих файлов.

Однако если вам нужна только разница, вы можете использовать команду ниже.

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

Связанный контент