1

Is it possible to use wc to count the chars of each line instead of the total amount of chars?

e.g.

echo -e foo\\nbar\\nbazz | grep -i ba

returns:

bar
bazz

So why doesn't echo -e foo\\nbar\\nbazz | grep ba | wc -m return a list of the lengths of those words? (3 and 4)

Suggestions?

P.S.: why are linefeeds counted with wc -m ? wc -l counts the newlines, so why should wc -m count them too?

  • 1
    That's wc -c you are looking for. – αғsнιη Oct 26 '17 at 16:08
  • 3
    @αғsнιη, wc -c counts the bytes while wc -m counts the characters, but that won't make a difference in this instance where all characters in that sample are single-byte ones. – Stéphane Chazelas Oct 26 '17 at 16:34
  • in fact echo 'Stéphane' | wc -m =9 but echo 'Stéphane' | wc -c =10 – JJoao Oct 26 '17 at 16:37
7

wc counts over the whole file; You can use awk to process line by line (not counting the line delimiter):

echo -e "foo\nbar\nbazz\n" | grep ba | awk '{print length}'

or as awk is mostly a superset of grep:

echo -e "foo\nbar\nbazz\n" | awk '/ba/ {print length}'

(note that some awk implementations report the number of bytes (like wc -c) as opposed to the number of characters (like wc -m) and others will count bytes that don't form part of valid characters in addition to the characters (while wc -m would ignore them in most implementations))

1

Here's another way to do it.

for line in $(echo -e foo\\nbar\\nbazz); do echo ${#line}; done

Output:

3
3
4
-1

You can iterate over the output lines and run wc for each:

echo -e foo\\nbar\\nbazz | \
grep -i ba | \
while read LINE; do echo $LINE | wc -m; done

If you don't want to count the newline characters, you can remove them:

echo -e foo\\nbar\\nbazz | \
grep -i ba | \
while read LINE; do echo ${LINE::-1} | wc -m; done

(The above assumes there is a newline after after line, so if the last line does not include a trailing newline, the count will be off.)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.