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
command-line
Chris Smith
la source
la source
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
./regexp/d
supprime une ligne si elle correspondregexp
et-e
active une syntaxe adéquate (IMNSHO) pourregexp
.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 inexplicablementbash
,perl
ouawk
nonwc
, voici quelques solutions:Bash seulement
Solutions Perl
et le beaucoup moins lisible:
Awk Solution
la source
Steven D a oublié GNU
sed
:Aussi, si vous voulez le nombre sans sortir le nom du fichier et que vous utilisez
wc
:Juste pour le plaisir:
la source
grep -c ''
, outr -dc '\n' | wc -c
, ounl -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 quewc -l
pure (ba) sh?sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
et vous pouvezcut -c -7
ne garder que le nombre. Ou, plus POSIXly:uniq -c file.txt | awk '{c+=$1}END{print c}'
. Pourquoi pasdc
(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
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.
la source
Si vous ne disposez que de bash et d’aucun outil externe, vous pouvez également procéder comme suit:
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èsdone
), l’entrée standard pour la boucle est defile.txt
.la source
Vous pouvez toujours utiliser la commande
grep
comme suit:Il comptera toutes les lignes réelles de
file.txt
, que sa dernière ligne contienne ou non un caractère LF à la fin.la source