检查 bash 中以逗号分隔的字符串中的重复单词

Check for duplicate word in comma-separated string in bash

我需要检查变量是否不包含逗号分隔字符串中的重复项。

例如,在 $animals 内,如果我有:

,dog,cat,bird,goat,fish,

这将被视为有效,因为每个词都是独一无二的。

字符串:

,dog,cat,dog,bird,fish,

将无效,因为 dog 输入了两次。

,dog,cat,dogs,bird,fish,

将是有效的,因为只有一个 dog 的实例(dogs 存在但允许,因为它不是同一个词)

字符串:

,dog,cat,DOG,bird,fish

也是无效的,因为 dogDOG 相同,只是大写。

有什么办法可以做到这一点吗?我会放一些我试过的代码,但我什至不知道用什么来做实验。

使用 bash 3.2.57(1)-在 10.11.6 El Capitan 上发布

区分大小写:

echo ",dog,cat,dog,bird,fish," | tr ',' '\n' | grep -v '^$' | sort | uniq -c | sort -k 1,1nr

不区分大小写:

echo ",dog,DOG,cat,dog,bird,fish," | tr ',' '\n' | grep -v '^$' | sort -rf | uniq -ci | sort -k 1,1nr

执行反向排序 (-r) 并不区分大小写以在大写字母之后获取小写字母。然后 uniq 他们 -i。 (您可能必须确保定义的排序规则 LC_COLLATE 以及 LANGLC_ALL 等语言环境不会影响 sort 行为)。

然后检查第一行的数字是否 > 1

简单的基于脚本的解决方案

用法

$ .\script.sh ,dog,dog,cat,

实际脚本

#!/bin/sh

num_duplicated() {
    echo  |
    tr ',' '\n' | # Split each items into its own line
    tr '[:upper:]' '[:lower:]' | # Convert everything to lowercase
    sort | # Sorts the lines (required for the call to `uniq`
    uniq -d | # Passing the `-d` flag to show only duplicated lines
    grep -v '^$' | # Passing `-v` on the pattern `^$` to remove empty lines
    wc -l # Count the number of duplicate lines
}

main() {
    num_duplicates=$(num_duplicated "") 
    if [[ $num_duplicates -eq '0' ]]
    then
        echo "No duplicates"
    else
        echo "Contains duplicate(s)"
    fi
}

main