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.