查找字符串中仅出现一次的单词



我如何找到一个在bash字符串中没有重复的单词?我想知道是否有"本机"bash方法可以做到这一点,或者我是否需要使用另一个命令行实用程序(如awk,sed,grep,...)。

例如,var1="thrice once twice twice thrice"; .我需要一些东西来拆分"一次"这个词,因为它只出现一次(即没有重复)。

您可以使用 sortuniq在用空格分割字符串后:

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

相关内容

  • 没有找到相关文章

最新更新