Counting the characters of each line with wc
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
Related videos on Youtube
sclaes
Updated on September 18, 2022Comments
-
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 shouldwc -m
count them too?-
αғsнιη over 6 yearsThat's
wc -c
you are looking for. -
Stéphane Chazelas over 6 years@αғsнιη,
wc -c
counts the bytes whilewc -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 over 6 yearsin fact
echo 'Stéphane' | wc -m
=9 butecho 'Stéphane' | wc -c
=10
-
-
Gilles 'SO- stop being evil' over 6 yearsThis 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' over 6 yearsBesides, 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.