Come contare le righe di testo?


14

Come contare quante righe ci sono nel file di testo. per esempio :

command file.txt

Nota, voglio contare solo le linee non vuote (linee senza contare gli spazi bianchi e le schede).



4
La domanda non è ben definita: una linea con solo spazi bianchi (spazi e TAB) è considerata vuota?
Rmano,

Elettori vicini : domanda modificata dopo il chiarimento di @ Rmano secondo il suo commento dell'OP. Quindi, per favore, non votate per chiudere Unclear
αғsнιη il

2
@KasiyA non è ancora chiaro. Non capisco se l'OP vuole contare una linea con solo spazi bianchi (spazi, tabulazioni \r) o saltarli. Le risposte correnti contano tutte le righe con spazi e saltano solo quelle vuote.
terdon,

@terdon OP NON VOGLIO contare le righe vuote (comprese le righe vuote ( \ro \n), le righe con solo schede e le righe con solo spazi) e voglio saltarle come penso e rispondere secondo Quello che ho capito.
αғsнιη,

Risposte:


11

La risposta sopra è corretta ma leggermente diversa, puoi usare il grep per un codice più semplicegrep -vc '^$' file.txt

Ad esempio (A): file.txt

$grep -vc '^$' file.txt

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$2

Ad esempio (B): file.txt

$sed '/^$/d' file.txt | wc -l

1    First line         #This is two tabs to comment.
2    
4
3    Fourth line        #Another two tabs to comment.

$4

Si noti che il risultato è 4! quando vogliamo aspettarci solo due. ma questo conta anche le schede tra contenuto e commento.

Notare che i conteggi da 0 e i conteggi da 1 sono diversi da grep a sed mentre ricordo che per maggiori dettagli cerca grep o sed.


1
Entrambi i tuoi esempi conterranno le righe vuote, ma OP ha richiesto un comando per contare tutto MA le righe vuote
kos

2
In realtà mi sbaglio, l' sedopzione è effettivamente corretta, ma non lo grepè
kos

Essendo solo parzialmente corretto, ho annullato la votazione della risposta, lasciami un commento quando l'hai risolto in modo da poter rimuovere il mio voto negativo
kos

1
@kos Sono abbastanza sicuro, noti quanto sia vaga la domanda?
amrx,

2
@kos, avevi ragione in primo luogo, grazie. Non dormo da più di 36 ore, immagino che sia ora di andare a letto!
amrx,

12

Prova sed:

sed '/^$/d' file.txt | wc -l

Se hai delle righe che contengono solo spazi o tab e se vuoi ignorarle anche dal conteggio:

sed '/^[[:blank:]]*$/d' file.txt | wc -l

3
Vorrei ^\s*$anche prendere in considerazione le righe contenenti solo tab o spazi.
Sylvain Pineau,

@SylvainPineau: Aggiunto ..
heemayl

1
Sono d'accordo che non era chiaro dalla domanda di OP, ma il testo con spazi / tab può modificare il risultato atteso, +1.
Sylvain Pineau,

3

Utilizzando grep:

grep -vc '^$' file  # or
grep -vc '^\s*$' file    

3

Puoi usare:

grep -cve '^\s*$' file.txt

Se hai bisogno di un comando per questo, basta incollare le seguenti righe nella tua .bashrce riavviare la sessione della shell o aprire un nuovo terminale:

count_lines()
{
    grep -cve '^\s*$' $1
}

Esempio:

count_lines file.txt
42

2

Con :

awk 'NF{++count} END{print count}' file

Spiegazione:

Il NFindica il numero totale dei campi, e quindi questa stampe solo linee non vuote , poiché in righe non vuote NFè maggiore 0e restituisce TRUE. Quindi incrementa il flag di conteggio quando awk ha trovato una riga non vuota e stampa l'ultimo valore del flag di conteggio alla fine di END{print count}.


1

Modifica : puoi semplicemente aggiungere l' copzione grepinvece di eseguire il piping di tutto wc, vedi la risposta di @ muru per una versione più compatta


Con grep:

grep -v '^$' file.txt | wc -l

0

Soluzione Perl

Perl può farlo. In generale le linee di conteggio funzionano così:

$ perl -ne 'END{print $.}' input.txt                                                                                     

Se vogliamo escludere tutte le righe vuote, faremo qualcosa del genere:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             

Diciamo che abbiamo un file di input come questo

$ cat -n input.txt
     1  Cat; Dog; Squirrel
     2  ORGANISM Animalus terrus
     3  
     4  Sequence: ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
     5  

Ci sono 5 righe in totale, 2 righe vuote. Il comando che abbiamo emetterebbe:

$ perl -ne '$c+=1 if not /^$|^\s+$/;END{print $c}' input.txt                                                             
3

Miglioramento di più file

Funziona bene per un singolo file. Se vogliamo farlo funzionare su più file, possiamo fare qualcosa del genere:

$ perl -ne '$c+=1 if not /^$|^\s+$/;printf("%d %s\n",$c,$ARGV) and $c=0 if eof' input.txt /etc/passwd                    
3 input.txt
52 /etc/passwd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.