Utilities

如何使用 Unix 工具查找兩個字元串中標記的差異?

  • March 27, 2014

我有兩個字元串如下 -

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 的鍵。但我想有一種更短的方法。

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來抑制一列(比如抑制第三列)。

從 Ramesh 中汲取基本思想

awk使用GNUbash

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

引用自:https://unix.stackexchange.com/questions/121846