¿Cómo obtengo el recuento de caracteres de las palabras en una columna en particular?

12

Tengo un archivo CSV como este:

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

¿Cómo puedo obtener el recuento de caracteres de solo las palabras de la tercera columna?

No puedo entender cómo wchacer esto.

usuario3116123
fuente

Respuestas:

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

(recuerde que wc -ccuenta bytes, no 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

)

Stéphane Chazelas
fuente
Pero él especifica '¡No puedo usar el wccomando para obtener resultados!'
mikeserv
3
@mikeserv, que interpreto porque no pude wcdarme el recuento de caracteres, por eso muestro cómo usarlo wcen este contexto.
Stéphane Chazelas
Oh .... Esa es una muy interpretación válida, que nunca en absoluto me ocurrió ...
mikeserv
22
awk -F, '{sum+=length($3)}; END {print +sum}' file
Hauke ​​Laging
fuente
3
Amén; awkfue diseñado para procesar archivos basados ​​en columnas, línea por línea. El problema se adapta perfectamente a la herramienta.
Rayo
¿Cuál es el propósito de + en {print + sum}? {print sum} funciona igual de bien.
Spuder
3
@spuder, para imprimir en 0lugar de una línea vacía cuando el archivo de entrada está vacío.
Stéphane Chazelas
2
@Ray, por otro lado, la tarea se puede lograr al tener 3 utilidades básicas (cada una de las cuales es una fracción del tamaño de awk) cooperando con el caso (trabajando simultáneamente) en el espíritu típico de Unix. Puede notar cómo el cut + tr + wc one es 5 tipos tan rápido como este awk one 5 veces más rápido que el anterior perl. (al menos en mi sistema, en un entorno local UTF8, probé en un archivo de 100 MB).
Stéphane Chazelas
5

Una perlsolución:

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

o una versión más corta:

perl -Mopen=:locale -F, -anle '$sum += length($F[2])}{print $sum' file
Cuonglm
fuente
Tenga en cuenta que devuelve un recuento de bytes, no necesariamente un recuento de caracteres.
Stéphane Chazelas
@StephaneChazelas: length () devuelve el recuento de caracteres lógicos, no bytes físicos según perldoc.
Cuonglm
Pero es necesario -Mopen=:localepara perlutilizar el / definición del sistema del usuario de lo que un personaje es, de lo contrario se asume caracteres son bytes. Pruebe una a,1,españa,2entrada en un entorno local UTF-8 (el valor predeterminado en la mayoría de los sistemas).
Stéphane Chazelas
@StephaneChazelas: Oh, actualicé mi respuesta. Gracias por buen punto!
Cuonglm
3
cut -d, -f3 <<\DATA | grep -o . | grep -c .
abd,123,egypt,78
cde,456,england,45
DATA

#OUTPUT
12
mikeserv
fuente
3

También podrías usar

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

En perl:

perl -F, -Mopen=:locale -lane 'print length $F[2]' your_file
Joseph R.
fuente
1

Con su archivo de muestra así:

$ 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

Trabajar con wcpara obtener el recuento de cada línea puede ser complicado. Debe llamarlo para cada cadena desde la columna 3 individualmente, lo que hace que sea un poco difícil hacer lo que desea. Tienes que mirar a través de cada fila de tu CSV, extraer la columna 3 y luego presentarla wcpara obtener el recuento de caracteres.

slm
fuente
0

Usando sedyawk

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

Ejemplo:

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

Dos awk's

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

Ejemplo:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
Avinash Raj
fuente