Como obtenho a contagem de caracteres de palavras em uma coluna específica?


12

Eu tenho um arquivo CSV como este:

abd,123,egypt,78
cde,456,england,45

Como posso obter a contagem de caracteres apenas das palavras da 3ª coluna?

Não consigo descobrir como wcfazer isso.

Respostas:


23
cut -d, -f3 | tr -d '\n' | wc -m

(lembre-se de que wc -cconta bytes, não caracteres:

$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -c
7
$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -m
6

)


Mas ele especifica 'Não consigo usar o wccomando para obter saída!'
mikeserv

3
@mikeserv, que interpreto como não consegui wcme dar a contagem de caracteres, e é por isso que mostro como usar wcnesse contexto.
Stéphane Chazelas

Oh .... Essa é uma muito interpretação válida que nunca em toda ocorreu-me ...
mikeserv

22
awk -F, '{sum+=length($3)}; END {print +sum}' file

3
Amém; awkfoi projetado para processar arquivos baseados em colunas, linha por linha. O problema é perfeitamente adequado para a ferramenta.
Ray

Qual é o objetivo de + em {print + sum}? {print sum} também funciona.
Spuder

3
@ spuder, é para imprimir em 0vez de uma linha vazia quando o arquivo de entrada estiver vazio.
Stéphane Chazelas

2
@Ray, por outro lado, a tarefa pode ser realizada com 3 utilitários básicos (cada um deles com uma fração do tamanho awk) cooperando com o caso (trabalhando simultaneamente) no espírito típico do Unix. Você pode perceber como o cut + tr + wc one é de 5 tipos tão rápido quanto este próprio awk 5 vezes mais rápido que o perloutro. (pelo menos no meu sistema, em um código de idioma UTF8, tentei em um arquivo de 100 MB).
Stéphane Chazelas

5

Uma perlsolução:

perl -Mopen=:locale -F, -anle '$sum += length($F[2]); END{print $sum}' file

ou uma versão mais curta:

perl -Mopen=:locale -F, -anle '$sum += length($F[2])}{print $sum' file

Observe que ele retorna uma contagem de bytes, não necessariamente uma contagem de caracteres.
Stéphane Chazelas

@StephaneChazelas: length () retorna a contagem de caracteres lógicos, não bytes físicos, de acordo com o perldoc.
cuonglm

Mas você precisa -Mopen=:localepara perlusar a definição do usuário / sistema do que um personagem é, caso contrário, assume personagens são bytes. Tente uma a,1,españa,2entrada em um código de idioma UTF-8 (o padrão na maioria dos sistemas).
Stéphane Chazelas

@StephaneChazelas: Ah, atualizei minha resposta. Obrigado pelo bom ponto!
cuonglm

3
cut -d, -f3 <<\DATA | grep -o . | grep -c .
abd,123,egypt,78
cde,456,england,45
DATA

#OUTPUT
12

3

Você também pode usar

awk -F, '{printf "%s", $3}' file | wc -m

3

Em Perl:

perl -F, -Mopen=:locale -lane 'print length $F[2]' your_file

1

Com o seu arquivo de amostra da seguinte forma:

$ cat sample.txt 
abd,123,egypt,78
cde,456,england,45

$ awk -F, '{print $3}' sample.txt | while read i; do echo "$i" | \
    tr -d '\n' | wc -m; done
5
7

Trabalhar wcpara obter a contagem de cada linha pode ser complicado. Você deve chamá-lo para cada sequência da coluna 3 individualmente, o que torna um pouco complicado fazer o que você deseja. Você deve examinar cada linha do seu CSV, extrair a coluna 3 e apresentá-la aowc para obter a contagem de caracteres.


0

Usando sed eawk

sed 's/.*,.*,\(.*\),.*/\1/g' file | awk -v FS="" '{print NF;}'

Exemplo:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | sed 's/.*,.*,\(.*\),.*/\1/g' | awk -v FS="" '{print NF;}'
5
7

Dois awk's

awk -F, '{print $3}' file | awk -v FS="" '{print NF;}'

Exemplo:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.