2012-01-09 15 views

risposta

87

Utilizza Awk.

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

Penso che 'print length;' sia equivalente e POSIX pure http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html –

+1

Funziona anche su mac os. – bdemarest

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

E 'POSIX, così dovrebbe funzionare ovunque.

Modifica: Aggiunto -r come suggerito da William.

+0

+1, ma ... fallirà se l'input contiene '\'. Usa read -r –

0

Prova questo:

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

Intendevi 'echo -e | wc -m', non è vero? È un uso inutile dei comandi; la shell può contare i caratteri in una variabile. Inoltre, 'echo -e' è totalmente incompatibile e funziona a metà delle shell, iniziando con alcune sequenze di escape che funzionano in altre e niente nel resto. –

+0

Sì, corretto ... errore. Grazie per averlo indicato. – Rahul

2

Ecco esempio usando xargs:

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

Questo "echo%" non gestisce i caratteri non sicuri che devono essere citati dalla shell. Inoltre, "xargs" sta per dividere il tuo file per spazi e ritorni a capo, non solo per le nuove linee come richiesto dal poster originale. – bovine

1

ho provato le altre risposte di cui sopra, ma sono molto lontani da soluzioni decenti quando si tratta di file di grandi dimensioni - specialmente quando le dimensioni di una singola riga occupano più di ~ 1/4 della RAM disponibile.

Sia bash che awk borbottano l'intera linea, anche se per questo problema non è necessario. Bash genererà un errore una volta che una riga è troppo lunga, anche se hai abbastanza memoria.

Ho implementato uno script python estremamente semplice e abbastanza non ottimizzato che, se testato con file di grandi dimensioni (~ 4 GB per riga), non si annulla, ed è di gran lunga una soluzione migliore di quelle fornite.

Se questo è il tempo di codice critico per la produzione, si può riscrivere le idee in C o eseguire ottimizzazioni meglio sulla chiamata di lettura (invece che solo la lettura di un singolo byte alla volta), dopo la prova che questo è davvero un collo di bottiglia.

Il codice presuppone che newline sia un carattere linefeed, che è una buona ipotesi per Unix, ma YMMV su Mac OS/Windows. Assicurati che il file finisca con un avanzamento di riga per garantire che l'ultimo conteggio dei caratteri non venga trascurato.

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 
Problemi correlati