使用 Bash 计算字符串中字符的出现次数

我需要用 Bash 来数 字符串中一个字符的出现次数

在下面的例子中,当字符是(例如) t时,它就是 var中出现 t的正确次数 echo,但是当字符是逗号或分号时,它就输出零:

var = "text,text,text,text"
num = `expr match $var [,]`
echo "$num"
190814 次浏览

我将使用以下 awk命令:

string="text,text,text,text"
char=","
awk -F"${char}" '{print NF-1}' <<< "${string}"

我将字符串分割为 $char并打印出结果字段数减1。

如果您的 shell 不支持 <<<操作符,请使用 echo:

echo "${string}" | awk -F"${char}" '{print NF-1}'

例如,你可以删除所有其他字符并计算剩下的字符数量,比如:

var="text,text,text,text"
res="${var//[^,]}"
echo "$res"
echo "${#res}"

将打印

,,,
3

或者

tr -dc ',' <<<"$var" | awk '{ print length; }'

或者

tr -dc ',' <<<"$var" | wc -c    #works, but i don't like wc.. ;)

或者

awk -F, '{print NF-1}' <<<"$var"

或者

grep -o ',' <<<"$var" | grep -c .

或者

perl -nle 'print s/,//g' <<<"$var"

如果您的服务器有 awk,那么它工作得很好

var="text,text,text,text"
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"

可以通过组合 trwc命令来实现。例如,在字符串 referee中计算 e

echo "referee" | tr -cd 'e' | wc -c

输出

4

说明: 命令 tr -cd 'e'删除除‘ e’以外的所有字符,命令 wc -c计算剩余字符数。

多行输入对于这个解决方案也很有用,比如命令 cat mytext.txt | tr -cd 'e' | wc -c可以计算文件 mytext.txt中的 e,即使文件可能包含许多行。

最新消息

要解决数字(@tom10271)中的多个空格,只需附加一个管道 tr 命令:

 tr -d ' '

例如:

echo "referee" | tr -cd 'e' | wc -c | tr -d ' '

我的建议如下:

var="any given string"
N=${#var}
G=${var//g/}
G=${#G}
(( G = N - G ))
echo "$G"

不能调用其他程序

基于每个人的精彩回答和评论,这是最简短和最甜蜜的版本:

grep -o "$needle" <<< "$haystack" | wc -l

再看看这个,比如我们要计算 t

echo "test" | awk -v RS='t' 'END{print NR-1}'

或者 python

python -c 'print "this is for test".count("t")'

或者更好的是,我们可以使用 awk使脚本动态

echo 'test' | awk '{for (i=1 ; i<=NF ; i++) array[$i]++ } END{ for (char in array) print char,array[char]}' FS=""

在这种情况下,输出如下:

e 1
s 1
t 2

Awk 很酷,但为什么不简单一点呢?

num=$(echo $var | grep -o "," | wc -l)

到目前为止,这里提供的 awk解决方案如果你的文本中有一个换行符,那么所有的解决方案都会中断。例如:

text="one,two,thr
ee,four"
DELIM=','
count=$( awk -F"$DELIM" '{print NF-1}' <<<"${text}" )
echo $count

结果:

2
1

还可以正确使用换行符的解决方案是:

text="one,two,thr
ee,four"
DELIM=','
count=$( awk 'BEGIN{RS="'"$DELIM"'";FS=""}END{print NR-1}' <<<"${text}" )
echo $count

结果是 3