Je suis sûr qu'il y a plusieurs façons de procéder: comment compter le nombre de lignes d'un fichier texte?
$ <cmd> file.txt
1020 lines
Je suis sûr qu'il y a plusieurs façons de procéder: comment compter le nombre de lignes d'un fichier texte?
$ <cmd> file.txt
1020 lines
Réponses:
La méthode standard est avec wc
, qui prend des arguments pour spécifier ce qu’elle doit compter (octets, caractères, mots, etc.); -l
est pour les lignes:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
. /regexp/d
supprime une ligne si elle correspond regexp
et -e
active une syntaxe adéquate (IMNSHO) pour regexp
.
grep -v '^+ *%' matlab.git.diff | wc -l
?
grep
commande afin de considérer comme des commentaires comme " + Hello"
(notez les espaces avant +
)?
grep -v '^ *+' matlab.git.diff | wc -l
(je suppose que les signes de citation n'étaient pas censés faire partie de la ligne; je suppose également que les deux lignes avec et sans espace devant +
sont destinées à être des commentaires; au moins un espace est obligatoire, remplacez l'étoile *
par \+
ou ajoutez simplement un autre espace devant l'étoile). Au lieu de ne faire correspondre que des espaces, vous souhaiterez probablement faire correspondre des espaces arbitraires; pour cela, remplacez l'espace par [[:space:]]
. Notez que j'ai aussi supprimé la correspondance %
car le n'est pas dans votre exemple.
Comme Michael l'a dit, wc -l
c'est la voie à suivre. Mais, au cas où vous avez inexplicablement bash
, perl
ou awk
non wc
, voici quelques solutions:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
et le beaucoup moins lisible:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
Steven D a oublié GNU sed
:
sed -n '$=' file.txt
Aussi, si vous voulez le nombre sans sortir le nom du fichier et que vous utilisez wc
:
wc -l < file.txt
Juste pour le plaisir:
cat -n file.txt | tail -n 1 | cut -f1
grep -c ''
, ou tr -dc '\n' | wc -c
, ou nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... Est-ce que l'un quelconque de ceux-ci est utile en soi (par opposition aux éléments sur lesquels s'appuyer pour créer un programme qui fait plus que compter les lignes), autre que wc -l
pure (ba) sh?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
et vous pouvez cut -c -7
ne garder que le nombre. Ou, plus POSIXly: uniq -c file.txt | awk '{c+=$1}END{print c}'
. Pourquoi pas dc
(même si ce n'est pas POSIX)? uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
. bc
est Posix: uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
. La réponse facile si vous assumez une longueur de ligne limitée: uniq -c -f 100000 file.txt
.
Mot d'avertissement lors de l'utilisation
wc -l
Parce que wc -l fonctionne en comptant \ n, si la dernière ligne de votre fichier ne se termine pas par une nouvelle ligne, le nombre de lignes sera désactivé de 1. (d'où l'ancienne convention laissant la nouvelle ligne à la fin de votre fichier).
Étant donné que je ne peux jamais être sûr qu'un fichier donné respecte la convention consistant à mettre fin à la dernière ligne avec une nouvelle ligne ou non, je vous recommande d'utiliser l'une de ces commandes de remplacement, qui inclura la dernière ligne dans le décompte, que la nouvelle ligne soit sélectionnée ou non.
sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename
Si vous ne disposez que de bash et d’aucun outil externe, vous pouvez également procéder comme suit:
count=0
while read
do
((count=$count+1))
done <file.txt
echo $count
Explication: la boucle lit ligne par ligne les entrées standard ( read
; puisque nous ne faisons rien de toute façon avec l'entrée de lecture, aucune variable n'est fournie pour la stocker) et augmente la variable à count
chaque fois. En raison de la redirection ( <file.txt
après done
), l’entrée standard pour la boucle est de file.txt
.