¿Cómo puedo contar el número de líneas en un archivo después de una coincidencia grep?


14

Estoy tratando de contar el número de líneas después de una fila problemática en un archivo csv. Soy consciente de que puedo usar elgrep -a # sintaxis para generar # número de líneas después de encontrar una coincidencia. Solo me interesa el número real de líneas. Me doy cuenta de que podría establecer el número en MAX_INT, canalizarlo en un archivo y hacer un poco más de procesamiento.

Estoy buscando un breve resumen para decirme el recuento.

¿Alguna sugerencia?

Respuestas:


15
{ grep -m1 match; grep -c ''; } <file

Eso funcionará con GNU grepy un lseek()archivo capaz. El primero grepse detendrá en 1 -match, y el segundo-c cada línea restante en la entrada.

Sin GNU grep:

{ sed '/match/q'; grep -c ''; } <file

Por supuesto, w / grepusted puede usar cualquiera / todas sus otras opciones además, y no es necesario detenerse en una partida.


Ambos también imprimen la línea, y el segundo en imprime hasta la primera coincidencia y luego 0 para mí.
123

@ Usuario112638726: por supuesto, puede descartar la impresión de la primera coincidencia grep -m1 match >/dev/null. Y su segundo problema es un GNU sed: no restablece su desplazamiento de entrada por especificación. Tienes que usar -uw / GNU, que no siempre es deseable. Podría haber sido más claro, pero supuse que GNU grepy GNU sedvendrían en pares. Creo que también grep -qm1podría funcionar para atajar la /dev/nullredirección, pero GNU grephace cosas raras con las que -qno puedo recordar cómo funcionan juntas.
mikeserv

1
Buena respuesta: realmente demuestra el poder de las agrupaciones de comandos. No estoy seguro, pero supongo que wc -les un poco más barato que grep -c ''.
Trauma digital

1
@DigitalTrauma - Sí, lo consideré (en retrospectiva) , pero ya lo había escrito, y casi rimaba, así que pensé que lo había dejado bastante bien solo. Y de todos modos, tú también lo dijiste, así que dormiré tranquilo ahora.
mikeserv

9

Aquí hay una manera.

$ cat foo
aaa
bbb
ccc
ddd
eee
fff
$ awk '/^ddd/{a=FNR}END{print FNR-a}' foo
2
$

44
esto no es codegolf, ¿puedes dar detalles (FNR, END, etc.)?
Archemar

3
Seguro. awk usa FNR para identificar el número de registro de entrada. END es el código ejecutado al llegar al final del archivo. Entonces, cuando se encuentra una coincidencia, se registra el número de registro actual. Al llegar al final del archivo, ese número se resta del número total de líneas en el archivo.
Steve

1
También puede usar NR ya que es un archivo.
123

6

Otra forma: el uso de dces un poco esotérico, pero parece funcionar bien aquí:

sed -n '/problem/=;$=' prob.txt | dc -e '??r-p'

sedbusca prob.txt"problema" y la última línea, y utiliza el =comando para generar el número de línea de ambos.

dc lee estos dos valores en la pila, los invierte, sustrae e imprime la diferencia.


5

Completamente con sed (aunque dos comandos con una tubería)

sed '/ddd/,$!d' file | sed -n '$='

Elimina toda la línea antes de la línea y luego el siguiente comando cuenta las líneas en el nuevo archivo.


3

Esto debería eliminar todas las líneas hasta (e incluyendo) la problemática y luego contar las líneas restantes:

sed '1,/problem/d' data.txt | wc -l

1
(asumiendo que "problema" no está en la primera línea)
Stéphane Chazelas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.