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
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
Risposte:
Il modo standard è with wc
, che accetta argomenti per specificare cosa dovrebbe contare (byte, caratteri, parole, ecc.); -l
è per le linee:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
. /regexp/d
elimina una riga se corrisponde regexp
e -e
attiva una sintassi (IMNSHO) adeguata per regexp
.
grep -v '^+ *%' matlab.git.diff | wc -l
?
grep
comando per considerare come casi di commento come " + Hello"
(notare gli spazi prima del +
)?
grep -v '^ *+' matlab.git.diff | wc -l
(Suppongo che i segni delle virgolette non fossero in realtà destinati a far parte della linea; presumo anche che entrambe le linee con e senza spazi davanti a +
siano pensate per essere commenti; se a è obbligatorio almeno uno spazio, o sostituire la stella *
con \+
o semplicemente aggiungere un altro spazio davanti alla stella). Probabilmente invece di abbinare solo gli spazi, dovresti abbinare spazi bianchi arbitrari; per questo sostituisci lo spazio con [[:space:]]
. Nota che ho rimosso anche la corrispondenza %
poiché non è nel tuo esempio.
Come ha detto Michael, wc -l
è la strada da percorrere. Ma, nel caso in cui inspiegabilmente avete bash
, perl
o awk
ma non wc
, qui ci sono un paio di soluzioni:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
e molto meno leggibile:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
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
grep -c ''
, o tr -dc '\n' | wc -c
, o nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... Qualcuno di questi è utile in sé (al contrario delle cose su cui costruire per creare un programma che fa più del conteggio delle righe), diverso da wc -l
e puro (ba) sh?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
e puoi cut -c -7
mantenere solo il numero. O, più POSIXly: uniq -c file.txt | awk '{c+=$1}END{print c}'
. Che ne dici dc
(anche se non è POSIX)? uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
. bc
è POSIX: uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
. La risposta più semplice se si assume una lunghezza della linea limitata: uniq -c -f 100000 file.txt
.
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
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 loop 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 count
ogni volta la variabile . A causa del reindirizzamento ( <file.txt
dopo done
), l'input standard per il loop proviene da file.txt
.