Utilities
如何使用 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 的鍵。但我想有一種更短的方法。
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
來抑制一列(比如抑制第三列)。
從 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