10

I have to write a script that takes a sentence and prints the word count, character count (excluding the spaces), length of each word and the length. I know that there exist wc -m to counter number of characters in the word, but how to make use of it in script?

#!/bin/bash

mystring="one two three test five"
maxlen=0;
for token in $mystring; do
  echo -n "$token: ";
  echo -n $token | wc -m;
    if [ ${#token} -gt $maxlen ]; then 
      maxlen=${#token}; fi;
done

echo "--------------------------";
echo -n "Total words: ";
echo "$mystring" | wc -w;
echo -n "Total chars: ";
echo "$mystring" | wc -m;
echo -n "Max length: "; 
echo $maxlen
Cœur
  • 37,241
  • 25
  • 195
  • 267
mydreamadsl
  • 568
  • 4
  • 16
  • 25
  • Sounds like [tag:homework]. If it is, please tag it as such. For many of us, if we see that tag, we'll make a greater effort to help you learn why the answer is what it is, rather than just providing a solution. – ghoti Jan 05 '12 at 02:56
  • thank you, ghoti, will mention further. But i am just practising with scripts and shell commands – mydreamadsl Jan 05 '12 at 02:59
  • And what is your question? – Raedwald Jul 09 '13 at 19:55
  • The one liner for the CLI: `echo 'Here is my test String' | wc -m` – yurisich Feb 13 '14 at 15:35

7 Answers7

12

riffing on Jaypal Singh's answer:

jcomeau@intrepid:~$ mystring="one two three four five"
jcomeau@intrepid:~$ echo "string length: ${#mystring}"
string length: 23
jcomeau@intrepid:~$ echo -n "lengths of words: "; i=0; for token in $mystring; do echo -n "${#token} "; i=$((i+1)); done; echo; echo "word count: $i"
lengths of words: 3 3 5 4 4 
word count: 5
jcomeau@intrepid:~$ echo -n "maximum string length: "; maxlen=0; for token in $mystring; do if [ ${#token} -gt $maxlen ]; then maxlen=${#token}; fi; done; echo $maxlen
maximum string length: 5
jcomeau_ictx
  • 37,688
  • 6
  • 92
  • 107
10
echo $mystring | wc -w

or

echo $mystring | wc --words

will do a word count for you.

You can pipe each word to wc:

echo $token | wc -m

to store the result in a variable:

mycount=`echo $token | wc -m`
echo $mycount

to add to the total as you go word by word, do math with this syntax:

total=0
#start of your loop
total=$((total+mycount))
#end of your loop
echo $total
Adam Dymitruk
  • 124,556
  • 26
  • 146
  • 141
4
#!/bin/bash

mystring="one two three test five"
for token in $mystring; do
  echo -n "$token: ";
  echo -n $token | wc -m;
done
echo "--------------------------";
echo -n "Total words: ";
echo "$mystring" | wc -w;
echo -n "Total chars: ";
echo "$mystring" | wc -m;
Eugen Rieck
  • 64,175
  • 10
  • 70
  • 92
4
string="i am a string"

n=$(echo $string | wc -w )

echo $n

4

The value of n can be used as an integer in expressions

eg.

echo $((n+1))
5
Aaron
  • 55,518
  • 11
  • 116
  • 132
daya
  • 997
  • 6
  • 7
2

You are very close. In bash you can use # to get the length of your variable.

Also, if you want to use bash interpreter use bash instead of sh and the first line goes like this -

#!/bin/bash

Use this script -

#!/bin/bash

mystring="one two three test five"
for token in $mystring
do
    if [ $token = "one" ]
    then
        echo ${#token}
    elif [ $token = "two" ]
    then
        echo ${#token}
    elif [ $token = "three" ]
    then
        echo ${#token}
    elif [ $token = "test" ]
    then
        echo ${#token}
    elif [ $token = "five" ]
    then
        echo ${#token}
    fi
done
jaypal singh
  • 74,723
  • 23
  • 102
  • 147
0

code

var=(one two three)
length=${#var[@]}
echo $length

output

3
Alan
  • 1,479
  • 3
  • 20
  • 36
0

The wc command is a good bet.

$ echo "one two three four five" | wc
       1       5      24

where the result is number of lines, words and characters. In a script:

#!/bin/sh

mystring="one two three four five"

read lines words chars <<< `wc <<< $mystring`

echo "lines: $lines"
echo "words: $words"
echo "chars: $chars"

echo -n "word lengths:"
declare -i nonspace=0
declare -i longest=0
for word in $mystring; do
  echo -n " ${#word}"
  nonspace+=${#word}"
  if [[ ${#word} -gt $longest ]]; then
    longest=${#word}
  fi
done
echo ""
echo "nonspace chars: $nonspace"
echo "longest word: $longest chars"

The declare built-in casts a variable as an integer here, so that += will add rather than append.

$ ./doit
lines: 1
words: 5
chars: 24
word lengths: 3 3 5 4 4
nonspace chars: 19
ghoti
  • 45,319
  • 8
  • 65
  • 104