¿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.

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

)


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

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

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

3

También podrías usar

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

3

En perl:

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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.