如何使用 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抑制第三列)。

答案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

相关内容