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
Prima regola di sviluppo del software: "no" significa "no". Usa "num" o "numero". –
[citazione necessaria]. – uprego