2012-01-09 22 views

Respuesta

87

Usar Awk.

awk '{ print length($0); }' abc.txt 
+5

Creo que 'print length;' es equivalente y POSIX también http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html –

+1

Esto también funciona en mac os. – bdemarest

11
while read -r line; do echo ${#line}; done < abc.txt 

Es POSIX, así que debería funcionar en todas partes.

Editar: Agregado -r como lo sugiere William.

+0

+1, pero ... esto fallará si la entrada contiene '\'. Use read -r –

0

Prueba esto:

while read line  
do  
    echo -e |wc -m  
done <abc.txt  
+0

Quiere decir 'echo -e | wc -m', ¿verdad? Es un uso inútil de los comandos; shell puede contar caracteres en una variable. Además, 'echo -e' es totalmente incompatible y funciona en la mitad de las shells mientras se comienza con una secuencia de escape que funciona en otra y nada en el resto. –

+0

Sí, correcto ... error. Gracias por señalarlo. – Rahul

2

Aquí está utilizando xargs ejemplo:

$ xargs -I% sh -c 'echo % | wc -c' < file 
+0

Este "echo%" no maneja los caracteres inseguros que deben citarse desde el shell. Además, "xargs" va a dividir el archivo por espacios y líneas nuevas, no solo líneas nuevas, como solicitó el cartel original. – bovine

1

que he probado las otras respuestas mencionadas anteriormente, pero están muy lejos de las soluciones dignas cuando se trata de archivos de gran tamaño - especialmente una vez que el tamaño de una sola línea ocupa más de ~ 1/4 de RAM disponible.

Tanto bash como awk sorben toda la línea, aunque para este problema no es necesario. Bash errará una vez que una línea sea demasiado larga, incluso si tiene suficiente memoria.

Implementé una secuencia de comandos python extremadamente simple, no optimizada, que cuando se prueba con archivos grandes (~ 4 GB por línea) no gotea y es, con mucho, una solución mejor que las que se ofrecen.

Si este es el código de tiempo crítico para producción, puede volver a escribir las ideas en C o realizar mejores optimizaciones en la lectura (en lugar de leer solo un byte a la vez), después de probar que esto es un cuello de botella.

El código asume que newline es un carácter de salto de línea, que es una buena suposición para Unix, pero YMMV para Mac OS/Windows. Asegúrese de que el archivo finalice con un salto de línea para garantizar que no se pase por alto el último recuento de caracteres de la línea.

from sys import stdin, exit 

counter = 0 
while True: 
    byte = stdin.buffer.read(1) 
    counter += 1 
    if not byte: 
     exit() 
    if byte == b'\x0a': 
     print(counter-1) 
     counter = 0 
Cuestiones relacionadas