![如何使用 Unix 工具查找两个字符串中标记的差异?](https://linux22.com/image/52148/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20Unix%20%E5%B7%A5%E5%85%B7%E6%9F%A5%E6%89%BE%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E6%A0%87%E8%AE%B0%E7%9A%84%E5%B7%AE%E5%BC%82%EF%BC%9F.png)
我有两个字符串,如下所示-
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