Contando os caracteres de cada linha com wc

0

É possível usar o wc para contar os caracteres de cada linha em vez do total de caracteres?

por exemplo,

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

retorna:

bar
bazz

Então, por que não echo -e foo\nbar\nbazz | grep ba | wc -m Devolver uma lista dos comprimentos dessas palavras? (3 e 4)

Sugestões?

P.S .: por que os feeds de linha são contados com wc -m ? wc -l conta as novas linhas, então por que wc -m deve contá-las também?

    
por sclaes 26.10.2017 / 18:06

3 respostas

4

wc conta todo o arquivo; Você pode usar awk para processar linha por linha (sem contar o delimitador de linha):

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

ou como awk é principalmente um superconjunto de grep :

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

(observe que algumas implementações de awk informam o número de bytes (como wc -c ) em oposição ao número de caracteres (como wc -m ) e outras contam bytes que não fazem parte de caracteres válidos em além dos caracteres (enquanto wc -m os ignoraria na maioria das implementações))

    
por 26.10.2017 / 18:29
1

Aqui está outra maneira de fazer isso.

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

Saída:

3
3
4
    
por 27.10.2017 / 01:55
-1

Você pode iterar pelas linhas de saída e executar wc para cada:

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

Se você não quiser contar os caracteres de nova linha, poderá removê-los:

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

(O acima assume que há uma nova linha após a linha, por isso, se a última linha não incluir uma nova linha à direita, a contagem será desativada.)

    
por 26.10.2017 / 18:40