代码之家  ›  专栏  ›  技术社区  ›  leetbacoon

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

  •  0
  • leetbacoon  · 技术社区  · 5 年前

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

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

    ,dog,cat,bird,goat,fish,
    

    字符串:

    ,dog,cat,dog,bird,fish,
    

    从那以后就无效了 dog

    ,dog,cat,dogs,bird,fish,
    

    将有效,因为只有一个 ( dogs

    字符串:

    ,dog,cat,DOG,bird,fish
    

    也是无效的,因为 DOG 只有大写。

    使用bash3.2.57(1)-在ElCapitan 10.11.6上发布

    0 回复  |  直到 5 年前
        1
  •  2
  •   Amessihel    5 年前

    区分大小写:

    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 可能是像这样的地方 LANG LC_ALL 没有影响 sort 行为)。

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

        2
  •  2
  •   yongjieyongjie    5 年前

    使用

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

    #!/bin/sh
    
    num_duplicated() {
        echo $1 |
        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 "$1") 
        if [[ $num_duplicates -eq '0' ]]
        then
            echo "No duplicates"
        else
            echo "Contains duplicate(s)"
        fi
    }
    
    main $1