Estoy seguro de que hay muchas maneras de hacer esto: ¿cómo puedo contar el número de líneas en un archivo de texto?
$ <cmd> file.txt
1020 lines
Estoy seguro de que hay muchas maneras de hacer esto: ¿cómo puedo contar el número de líneas en un archivo de texto?
$ <cmd> file.txt
1020 lines
Respuestas:
La forma estándar es con wc
, que toma argumentos para especificar lo que debe contar (bytes, caracteres, palabras, etc.); -l
es para líneas:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
. /regexp/d
elimina una línea si coincide regexp
y -e
activa una sintaxis adecuada (IMNSHO) para regexp
.
grep -v '^+ *%' matlab.git.diff | wc -l
?
grep
comando para considerar como casos de comentarios como " + Hello"
(tenga en cuenta los espacios antes del +
)?
grep -v '^ *+' matlab.git.diff | wc -l
(supongo que los signos de comillas no estaban destinados a formar parte de la línea; también supongo que ambas líneas con y sin espacios en frente +
están destinadas a ser comentarios; si en al menos un espacio es obligatorio, reemplace la estrella *
con \+
, o simplemente agregue otro espacio delante de la estrella). Probablemente, en lugar de hacer coincidir solo espacios, desearía hacer coincidir espacios en blanco arbitrarios; para esto reemplace el espacio con [[:space:]]
. Tenga en cuenta que también he eliminado la coincidencia %
ya que no está en su ejemplo.
Como dijo Michael, wc -l
es el camino a seguir. Pero, en caso de que inexplicablemente tenga bash
, perl
o awk
no wc
, aquí hay algunas soluciones más:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
y lo mucho menos legible:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
Steven D olvidó GNU sed
:
sed -n '$=' file.txt
Además, si desea el recuento sin generar el nombre de archivo y está utilizando wc
:
wc -l < file.txt
Sólo por el gusto de hacerlo:
cat -n file.txt | tail -n 1 | cut -f1
grep -c ''
, o tr -dc '\n' | wc -c
, o nl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
... ¿Alguno de estos es útil en sí mismo (a diferencia de las cosas sobre las que construir para hacer un programa que haga más que contar líneas), aparte de wc -l
y puro (ba) sh?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
y puedes cut -c -7
mantener solo el número. O, más POSIXly: uniq -c file.txt | awk '{c+=$1}END{print c}'
. ¿Qué tal dc
(aunque no sea POSIX)? uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
. bc
es POSIX: uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
. La respuesta fácil si se asume una longitud de línea limitada: uniq -c -f 100000 file.txt
.
Palabra de advertencia al usar
wc -l
porque wc -l funciona contando \ n, si la última línea de su archivo no termina en una nueva línea, el recuento de líneas se desactivará en 1. (de ahí la convención anterior que deja nueva línea al final de su archivo)
Dado que nunca puedo estar seguro de si un archivo dado sigue la convención de terminar la última línea con una nueva línea o no, recomiendo usar cualquiera de estos comandos alternativos que incluirán la última línea en el conteo independientemente de la nueva línea o no.
sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename
En caso de que solo tenga bash y absolutamente ninguna herramienta externa disponible, también puede hacer lo siguiente:
count=0
while read
do
((count=$count+1))
done <file.txt
echo $count
Explicación: el bucle lee la entrada estándar línea por línea ( read
; como de todos modos no hacemos nada con la entrada de lectura, no se proporciona ninguna variable para almacenarla), y aumenta la variable count
cada vez. Debido a la redirección ( <file.txt
después done
), la entrada estándar para el bucle es de file.txt
.