Comment compter les lignes de texte?

14

Comment puis-je compter le nombre de lignes dans un fichier texte. par exemple :

command file.txt

Remarque, je veux seulement compter les lignes non vides (lignes sans compter les espaces blancs et les tabulations)?.

user93097373
la source
4
La question n'est pas bien définie: une ligne avec uniquement des espaces (espaces et TAB) est-elle considérée comme vide?
Rmano
Votants proches : Question modifiée après la clarification de @ Rmano selon son commentaire de OP. Alors, s'il vous plaît, ne votez pas pour fermer comme pas clair
αғsнιη
2
@KasiyA ce n'est toujours pas clair. Je ne comprends pas si l'OP veut compter une ligne avec uniquement des espaces (espaces, tabulations \r) ou les ignorer. Le courant répond à toutes les lignes de comptage avec des espaces et ne saute que les vides.
terdon
@terdon OP NE VEUX PAS compter les lignes vides (y compris les lignes vides ( \rou \n), les lignes avec seulement des tabulations et les lignes avec seulement les espaces) et je veux les sauter comme je pense et y répondre selon Ce que j'ai compris.
αғsнιη

Réponses:

11

Les réponses ci-dessus sont correctes mais légèrement différentes, vous pouvez utiliser le greppour un code plus facile telgrep -vc '^$' file.txt

Par exemple (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

Par exemple (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

Notez que le résultat est 4! quand on veut en attendre seulement deux. mais cela compte également les onglets entre le contenu et le commentaire.

Remarquez les nombres de 0 et les nombres de 1, c'est différent du grep au sed comme je me souviens pour plus de détails, recherchez grep ou sed.

amrx
la source
1
Vos deux exemples compteront les lignes vides, mais OP a demandé une commande pour tout compter MAIS les lignes vides
kos
2
En fait, je me trompe, l' sedoption est en fait correcte, mais celle- grepci ne l'est pas
kos
N'ayant que partiellement raison, j'ai dévalué la réponse, laissez-moi un commentaire lorsque vous l'avez corrigée pour que je puisse supprimer mon vote négatif
kos
1
@kos Je suis tout à fait sûr, vous remarquez à quel point la question est vague?
amrx
2
@kos, vous aviez raison en premier lieu, merci. Je n'ai pas dormi depuis plus de 36 heures, je suppose qu'il est temps de se coucher!
amrx
12

Essayez sed:

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

Si vous avez des lignes contenant uniquement des espaces ou des tabulations et si vous souhaitez également les ignorer du nombre:

sed '/^[[:blank:]]*$/d' file.txt | wc -l
heemayl
la source
3
Je voudrais ^\s*$également prendre en compte les lignes contenant uniquement des tabulations ou des espaces.
Sylvain Pineau
@SylvainPineau: Ajouté ..
heemayl
1
Je suis d'accord que ce n'était pas clair à partir de la question de OP, mais le texte avec des espaces / tabulation peut modifier le résultat attendu, +1.
Sylvain Pineau
3

En utilisant grep:

grep -vc '^$' file  # or
grep -vc '^\s*$' file    
muru
la source
3

Vous pouvez utiliser:

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

Si vous avez besoin d'une commande pour cela, collez simplement les lignes suivantes dans votre .bashrcet redémarrez votre session shell ou ouvrez un nouveau terminal:

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

Exemple:

count_lines file.txt
42
Sylvain Pineau
la source
2

Avec :

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

Explication:

Le NFindique le nombre total de champs, et donc cela n'imprime que les lignes non vides , car dans les lignes non vides NFest supérieur à 0et s'évalue comme vrai. Incrémentez donc l' indicateur de comptage lorsque awk a trouvé une ligne non vide et imprimez la dernière valeur de l' indicateur de comptage à la fin de END{print count}.

αғsнιη
la source
1

Edit : vous pouvez simplement ajouter l' coption au greplieu de tout diriger wc, voir la réponse de @ muru pour une version plus compacte


Avec grep:

grep -v '^$' file.txt | wc -l
kos
la source
0

Solution Perl

Perl peut le faire. En général, les lignes de comptage fonctionnent comme suit:

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

Si nous voulons exclure toutes les lignes vides, nous ferons quelque chose comme ceci:

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

Disons que nous avons un fichier d'entrée comme celui-ci

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

Il y a 5 lignes au total, 2 lignes vides. La commande que nous avons afficherait:

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

Amélioration multi-fichiers

Cela fonctionne bien pour un seul fichier. Si nous voulons le faire fonctionner sur plusieurs fichiers, nous pouvons faire quelque chose comme ceci:

$ 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
Sergiy Kolodyazhnyy
la source