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, grepo sedcomo 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íneaXcoincida. 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 Ygeneraría:1 2END{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/&&countcondiciónYs iniciales no deben contarse porque no están exactamente entre dosXs; el otro se queja de que losYs finales no se cuentan porque no están exactamente entre dosXs. 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
Xy si previamente le hemos asignado un valorprev, imprima el número de la línea actualNR, menosprevmenos uno./X/{prev=NR}Para cualquier línea que contenga
X, establezca la variableprevdel número de línea actual,NR.fuente
NRme da una idea:awk '/X/{print NR - 1; NR = 0}' fooX, 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
awkenfoque simple que funciona en los datos de muestra de OP y siXno 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
needlea su gusto. La ventaja de este método es que puede invocar el programa desde un script de shell con un valor arbitrarioneedlesin problemas:fuente