我如何找到一个在bash
字符串中没有重复的单词?我想知道是否有"本机"bash
方法可以做到这一点,或者我是否需要使用另一个命令行实用程序(如awk,sed,grep,...)。
例如,var1="thrice once twice twice thrice";
.我需要一些东西来拆分"一次"这个词,因为它只出现一次(即没有重复)。
您可以使用 sort
,uniq
在用空格分割字符串后:
tr ' ' 'n' <<< "$var1" | sort | uniq -u
这将为您的输入生成once
。
(如果输入包含标点符号,则可能需要先将其删除,以避免意外结果。
@devnull的
答案是更好的选择(无论是为了简单性还是性能),但如果您正在寻找仅 bash 的解决方案:
注意事项:
- 使用关联数组,这些数组仅在 bash 4 或更高版本中可用:
- 在输入单词列表中使用文字
*
不起作用(但是,其他类似 glob 的字符串是可以的)。 - 正确处理多行输入和单词之间具有多个空格字符的输入。
# Define the input word list.
# Bonus: multi-line input with multiple inter-word spaces.
var1=$'thrice once twice twice thricentwice again'
# Declare associative array.
declare -A wordCounts
# Read all words and count the occurrence of each.
while read -r w; do
[[ -n $w ]] && (( wordCounts[$w]+=1 ))
done <<<"${var1// /$'n'}" # split input list into lines for easy parsing
# Output result.
# Note that the output list will NOT automatically be sorted, because the keys of an
# associative array are not 'naturally sorted'; hence piping to `sort`.
echo "Words that only occur once in '$var1':"
echo "---"
for w in "${!wordCounts[@]}"; do
(( wordCounts[$w] == 1 )) && echo "$w"
done | sort
# Expected output:
# again
# once
只是为了好玩,尴尬:
awk '{
for (i=1; i<=NF; i++) c[$i]++
for (word in c) if (c[word]==1) print word
}' <<< "$var1"
once