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
command-line
Chris Smith
fuente
fuente
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
./regexp/d
elimina una línea si coincideregexp
y-e
activa una sintaxis adecuada (IMNSHO) pararegexp
.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 tengabash
,perl
oawk
nowc
, aquí hay algunas soluciones más:Solo Bash
Soluciones Perl
y lo mucho menos legible:
Awk Solution
fuente
Steven D olvidó GNU
sed
:Además, si desea el recuento sin generar el nombre de archivo y está utilizando
wc
:Sólo por el gusto de hacerlo:
fuente
grep -c ''
, otr -dc '\n' | wc -c
, onl -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 dewc -l
y puro (ba) sh?sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
y puedescut -c -7
mantener solo el número. O, más POSIXly:uniq -c file.txt | awk '{c+=$1}END{print c}'
. ¿Qué taldc
(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
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.
fuente
En caso de que solo tenga bash y absolutamente ninguna herramienta externa disponible, también puede hacer lo siguiente:
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 variablecount
cada vez. Debido a la redirección (<file.txt
despuésdone
), la entrada estándar para el bucle es defile.txt
.fuente
Siempre puede usar el comando de la
grep
siguiente manera:Contará todas las filas reales de
file.txt
, ya sea que su última fila contenga o no un carácter LF al final.fuente