Counting the characters of each line with wc

22,111

Solution 1

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))

Solution 2

Here's another way to do it.

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

Output:

3
3
4
Share:
22,111

Related videos on Youtube

sclaes
Author by

sclaes

Updated on September 18, 2022

Comments

  • sclaes
    sclaes over 1 year

    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?

    • αғsнιη
      αғsнιη over 6 years
      That's wc -c you are looking for.
    • Stéphane Chazelas
      Stéphane Chazelas over 6 years
      @αғ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.
    • JJoao
      JJoao over 6 years
      in fact echo 'Stéphane' | wc -m =9 but echo 'Stéphane' | wc -c =10
  • Gilles 'SO- stop being evil'
    Gilles 'SO- stop being evil' over 6 years
    This doesn't print the length of each line, it prints the length of the line, minus leading and trailing whitespace, plus the length of the next line if the first line ended with a backslash, and after replacing each whitespace-delimited word on the line by the list of matching file names if it happens to be a wildcard pattern matching that name. Approximately. See unix.stackexchange.com/questions/131766/… for explanations.
  • Gilles 'SO- stop being evil'
    Gilles 'SO- stop being evil' over 6 years
    Besides, this kind of line-by-line processing in the shell is a bad idea, and using an external tool in the loop body combines the worst of both worlds.