Bash를 사용하여 문자열에서 문자 발생 횟수 계산


123

Bash를 사용하여 문자열에서 문자의 발생 횟수를 계산해야합니다 .

다음 예에서, 숯 인 경우 (예) t, 그 echo이야 의 발생의 정확한 개수 t하여 var있지만, 문자 또는 쉼표 세미콜론되면 제로 출력한다 :

var = "text,text,text,text" 
num = `expr match $var [,]`
echo "$num"

답변:


118

다음 awk명령을 사용합니다 .

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

문자열을 분할하고 $char결과 필드 수에서 1을 뺀 값을 인쇄합니다.

쉘이 <<<연산자를 지원하지 않는 경우 다음을 사용하십시오 echo.

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

5
@HattrickNZ 그런 다음 사용 :$(grep -o "$needle" < filename | wc -l)
hek2mgl

13
@Amir 당신은 무엇을 기대합니까?
hek2mgl

3
을 건너 뛰고 wc -l그냥 사용 grep -c하면 bsd grep 및 linux grep 모두에서 작동합니다.
andsens

8
@andsens grep -c는 일치하는 줄 수만 출력합니다. 한 줄에 여러 일치 항목을 계산하지 않습니다.
hek2mgl

1
문자열에서 '$'를 세고 싶습니다. 어떻게 메인 문자열에서 '$'를 이스케이프 할 수 있습니까?
masT

117

예를 들어 다음과 같이 다른 모든 문자를 제거하고 남은 것을 계산할 수 있습니다.

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"

1
여기에 좀 더 트릭 같은y="${x//[^s|S]}"; echo "${#y}"
물병 전원

4
첫 번째 프로세스를 사용하고 항상 이와 같은 작업을 수행하기 위해 다른 프로세스를 생성하는 것을 피해야합니다. 대규모 반복 루프를 사용할 때 성능에 심각한 영향을 미칠 수 있습니다. 일반적으로 외부 프로세스 실행은 반복 작업을 사용할 때 최후의 수단이되어야합니다.
osirisgothra 2014-06-21

왜 좋아하지 wc않니? 골프!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli六四事件法轮功包卓轩때문에, 예를 들면echo -n some line | wc -l
jm666

제 생각에는 코드 블록 4가 최고입니다. 우리는 더 쉽게 갈 필요가 있습니다 :tr -dc ',' <<<"$var" | wc -c
bgStack15

68

trwc명령 을 결합하여 수행 할 수 있습니다 . 예를 들어, e문자열에서 계산 하려면 referee

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

산출

4

설명 : Command tr -cd 'e'는 'e'이외의 모든 문자를 제거하고 Command wc -c는 나머지 문자를 계산합니다.

여러 줄의 입력도이 솔루션에 적합합니다. 예를 들어 command cat mytext.txt | tr -cd 'e' | wc -ccan counts ein the file mytext.txt과 같이 파일에 여러 줄이 포함될 수 있다고 생각할 수도 있습니다.


3
귀하의 솔루션은 가장 깨끗하고 기억하기 쉬운 것 같습니다. 감사합니다!
jirislav

이것은 훌륭합니다. 감사합니다!
Kodie Grantham

나는 awk를 싫어하기 때문에 이것을 좋아한다!
franzisk

3

모든 사람의 훌륭한 답변과 댓글을 바탕으로 가장 짧고 달콤한 버전입니다.

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


2

awk는 서버에 있으면 잘 작동합니다.

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

그냥 참고로 : awk -F,A의 모습 ,. 다음을 수행 할 수 있습니다.awk -F"${your_char}"
Emixam23

1

다음을 제안합니다.

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

다른 프로그램에 대한 호출 없음


1

예를 들어 우리는 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.