it-swarm.it

contare le righe in un file

Sono sicuro che ci sono molti modi per farlo: come posso contare il numero di righe in un file di testo?

$ <cmd> file.txt
1020 lines
75
Chris Smith

Il modo standard è con wc, che accetta argomenti per specificare cosa dovrebbe contare (byte, caratteri, parole, ecc.); -l è per le righe:

$ wc -l file.txt
1020 file.txt
109
Michael Mrozek

Come disse Michael, wc -l è la strada da percorrere. Ma, nel caso in cui tu abbia inspiegabilmente bash, Perl o awk ma non wc, ecco alcune altre soluzioni:

Bash-only

$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT

Soluzioni Perl

$ Perl -lne 'END { print $. }' file.txt

e molto meno leggibile:

$ Perl -lne '}{ print $.' file.txt

Soluzione Awk

$  awk 'END {print NR}' file.txt
17
Steven D

Steven D ha dimenticato GNU sed:

sed -n '$=' file.txt

Inoltre, se si desidera il conteggio senza emettere il nome file e si sta utilizzando wc:

wc -l < file.txt

Solo per gioco:

cat -n file.txt | tail -n 1 | cut -f1

Avvertenza durante l'utilizzo

wc -l

poiché wc -l funziona contando\n, se l'ultima riga del file non termina in modo efficace con una nuova riga, il conteggio delle righe sarà disattivato di 1. (quindi la vecchia convenzione che lascia newline alla fine del file)

Dal momento che non posso mai essere sicuro che un determinato file segua la convenzione di terminare l'ultima riga con una nuova riga o meno, raccomando di usare uno di questi comandi alternativi che includerà l'ultima riga nel conteggio indipendentemente da newline o meno.

sed -n $= filename
Perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename
11
pretzels1337

Nel caso in cui tu abbia solo bash e assolutamente nessun strumento esterno disponibile, puoi anche fare quanto segue:

count=0
while read
do
  ((count=$count+1))
done <file.txt
echo $count

Spiegazione: il ciclo legge l'input standard riga per riga (read; poiché non facciamo comunque nulla con l'input di lettura, non viene fornita alcuna variabile per memorizzarlo) e aumenta ogni volta la variabile count . A causa del reindirizzamento (<file.txt dopo done), l'input standard per il loop proviene da file.txt.

3
celtschk

Puoi sempre usare il comando grep come segue:

grep -c "^" file.txt

Conterà tutte le righe effettive di file.txt, anche se la sua ultima riga contiene o meno un LF alla fine.

2
Paolo