Quiero contar las líneas entre "X" s. Esto es solo un ejemplo; Tengo que aplicar el código a un resultado biológico complejo. Le agradeceré si puede sugerir algún comando, preferiblemente usando awk
, grep
o sed
como estoy familiarizado con ellos.
Ejemplo:
X
Y
Y
Y
X
Y
Y
Y
Y
X
Y
X
Salida deseada:
3
4
1
Respuestas:
Con
awk
:Incremente un conteo por cada línea que no contenga
X
; imprimir y restablecer el recuento de líneas que contienenX
.fuente
X
, el primer número de líneas aún se contaría y generaría con esta solución, hasta que la primera líneaX
coincida. EX (No se pueden agregar nuevas líneas en los comentarios, pero considere que hay una nueva línea entre cada carácter; P):Y X Y Y X Y Y Y
generaría:1 2
END{if (count)print count}
), y al producir una línea vacía donde X estaba en el inicio para evitar, también puede agregar la/X/&&count
condiciónY
s iniciales no deben contarse porque no están exactamente entre dosX
s; el otro se queja de que losY
s finales no se cuentan porque no están exactamente entre dosX
s. Esperaré a que el OP se aclare, si es necesario; Estoy bien con esta respuesta tal como es hasta entonces.Cómo funciona:
Awk lee implícitamente los archivos de entrada línea por línea.
/X/ && prev{print NR-prev-1}
Para cualquier línea que contenga
X
y si previamente le hemos asignado un valorprev
, imprima el número de la línea actualNR
, menosprev
menos uno./X/{prev=NR}
Para cualquier línea que contenga
X
, establezca la variableprev
del número de línea actual,NR
.fuente
NR
me da una idea:awk '/X/{print NR - 1; NR = 0}' foo
X
, hay una pequeña diferencia en el resultado entre las 2 respuestas como lo expliqué en un comentario debajo de la respuesta de muru.Otro
awk
enfoque simple que funciona en los datos de muestra de OP y siX
no estaba en la primera o incluso en las últimas X repetidas.Arriba es correcto cuando solo hay un campo en cada línea con FS por defecto cualquier espacio en blanco , de lo contrario, a continuación se revisa en el caso general para contar linealmente . Puede ingresar su PATRÓN en lugar de X allí.
Entrada de muestra:
El resultado es:
fuente
La mayoría de las respuestas aquí coinciden con el contenido de la línea a contar utilizando expresiones regulares incrustadas en el programa Awk. Si necesita hacer coincidir líneas con contenido que puede contener caracteres especiales (ya sea Awk o expresiones regulares), sería mejor comparar las cadenas para la igualdad. Por lo tanto, propongo el siguiente script Awk como una variante de la respuesta de muru :
Almacénelo como un archivo de texto, por ejemplo
count-rows.awk
, e invoquelo de la siguiente manera:Puede ajustar el valor
needle
a su gusto. La ventaja de este método es que puede invocar el programa desde un script de shell con un valor arbitrarioneedle
sin problemas:fuente