我有两个字符串,如下所示-
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
抑制第三列)。
答案2
从 Ramesh 汲取基本思想
与 GNUawk
一起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' ' '
解释
我将这两个文件合并到另一个文件中,并用逗号作为分隔符分割标记。之后,我只打印唯一的值(意味着仅出现一次的值,我相信这就是您正在寻找的值)。
输入1文件内容
token1, token2, token3, token4, token5, token6, token8, token9, token10
输入2文件内容
token2, token7, token4, token3, token5, token6, token8, token10, token9
执行上述脚本后,我得到的输出为:
token1 token10 token2 token3 token4 token5 token6 token7 token8 token9
如果您观察上面的输出,它将仅打印两个文件中的唯一值。
但是,如果您只需要差异,则可以使用以下命令。
echo ${arr[@]} | sort | uniq -c