Tengo un archivo de texto con el siguiente contenido.
data void void void 1 2 3 end 6 7 8 9 data void void void 4 5 6 end 4 5 8 9Quería extraer líneas entre las cadenas 'data' y 'end' y lo logré con el siguiente awk one-liner
awk '/data/,/end/{i++} /end/{i=0} i>4' filenamela salida es
1 2 3 4 5 6Ahora quería la cantidad de veces que aparece el punto de datos antes de cada bloque. Algo como esto:
3 1 2 3 3 4 5 6¿Es posible lograr esto con awk?
Puede hacerlo con bastante facilidad si solo cuenta las líneas que están compuestas por dígitos entre la ocurrencia de data y el end y almacena los valores en una matriz indexada por el conteo. Luego, cuando se alcance el end , emita el conteo y luego los valores almacenados en la matriz antes de restablecer el conteo y la bandera que indica que está entre un data y el end , por ejemplo
awk ' /data/ { between = 1 } between==1 && $1~/^[[:digit:]]+$/ { a[++n] = $1 } /end/ { printf "\n%d\n\n", n for (i = 1; i <= n; i++) print a[i] between = n = 0 } ' file ( nota: si puede tener dos o más registros data sin un end que siga a cada registro data , deberá agregar una prueba o manejar eso según sea necesario. Eso se lo dejamos a usted).
Ejemplo de uso/resultado
Con su entrada en file , obtendría:
3 1 2 3 3 4 5 6Déjame saber si tienes más preguntas.
otro
awk '/data/{if(d) print ""; f=1;c=0;d=RS} f && /^[0-9]$/ {d=d RS $0; c++} /end/{f=0; print cd}' file 3 1 2 3 3 4 5 6Con sus muestras mostradas, intente seguir el programa awk .
awk ' /data/,/end/{ if($0~/^[0-9]/){ count++ } if($0~/^end/){ print (++count1>1? ORS count:count) ORS value value=count="" } value=($0~/^[0-9]/?(value?value ORS:"")$0:ORS) } ' Input_file Explicación: simplemente tomando valores entre el rango de data para end según las muestras mostradas. Luego, cada vez que la línea comience desde los dígitos, aumente el valor de la variable de conteo en 1 y siga agregando líneas en la variable de valor, cada vez que la línea comience desde el final, imprima el valor del valor de la variable y anule el valor y el conteo para reiniciarse.