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

问题描述 投票:0回答:10

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

在下面的示例中,当字符为(例如)

t

时,它 
echo
s
t
var
中出现的正确次数,但是当字符为逗号或分号时,它会打印出零:

var = "text,text,text,text" num = `expr match $var [,]` echo "$num"
    
bash shell sh
10个回答
174
投票
例如,您可以删除所有其他字符并计算剩余的内容,例如:

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"
    

129
投票
我会使用以下

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}'
    

112
投票
您可以通过组合

tr

wc
 命令来完成此操作。例如,要计算字符串 
e
 中的 
referee

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

4
说明:命令 

tr -cd 'e'

 删除除 'e' 之外的所有字符,命令 
wc -c
 计算剩余字符。

多行输入也适合此解决方案,例如命令

cat mytext.txt | tr -cd 'e' | wc -c

 可以在文件 
e
 中计数 
mytext.txt
,即使文件可能包含很多行。

*** 更新***

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

tr -d ' '
例如:

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

12
投票
awk 非常酷,但为什么不保持简单呢?

num=$(echo $var | grep -o "," | wc -l)
然后您可以将其重新用作函数:

# usage: echo "1,2,3,4,5" | text.count # outputs 4 function text.count(){ grep -o "$1" | wc -l }
    

7
投票
基于每个人的精彩答案和评论,这是最短和最甜蜜的版本:

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


    


2
投票
如果您的服务器有的话,awk 就可以很好地工作

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

2
投票
也检查一下,例如我们想要数

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
    

1
投票
我建议如下:

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

不调用任何其他程序


0
投票
如果文本中存在换行符,到目前为止提供的

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


0
投票
从文件中计算固定字符串(-F)

导出搜索模式=$(echo ",")

回显“文本,文本,文本,文本”| tr“,”' ' | sed 's/$/,/g' > 文件名

导出计数=$(grep -F $searchpattern 文件名 | wc -l)

回显“$count-1”|公元前

© www.soinside.com 2019 - 2024. All rights reserved.