
У меня есть две строки, как показано ниже:
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
Столбцы следующие:
- токены только в s1
- токены только в s2
- жетоны в обоих случаях.
Вы подавляете столбец, передавая соответствующую опцию (например, -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