检查 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
也是无效的,因为 dog
与 DOG
相同,只是大写。
有什么办法可以做到这一点吗?我会放一些我试过的代码,但我什至不知道用什么来做实验。
使用 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
以及 LANG
和 LC_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
我需要检查变量是否不包含逗号分隔字符串中的重复项。
例如,在 $animals
内,如果我有:
,dog,cat,bird,goat,fish,
这将被视为有效,因为每个词都是独一无二的。
字符串:
,dog,cat,dog,bird,fish,
将无效,因为 dog
输入了两次。
,dog,cat,dogs,bird,fish,
将是有效的,因为只有一个 dog
的实例(dogs
存在但允许,因为它不是同一个词)
字符串:
,dog,cat,DOG,bird,fish
也是无效的,因为 dog
与 DOG
相同,只是大写。
有什么办法可以做到这一点吗?我会放一些我试过的代码,但我什至不知道用什么来做实验。
使用 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
以及 LANG
和 LC_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