¿Cómo usar awk para dividir la fila (registro)?

¿Cómo usar awk para dividir la fila (registro)?

Archivo:

data
A B
C D
data
E F
G H
data
I J
K L
M N

Resultado deseado:

I J
K L
M N

¿Cómo dividir por "datos"? He estado buscando en Google cómo usar awk, pero la mayor parte del awk relativo está dividido en columnas.

Respuesta1

Para utilizar datacomo separador de registros e imprimir el último registro:

$ awk -v RS=data 'END{print}' File

I J
K L
M N

Esto requiere un awk, como GNU awk (gawk) o mawk, que admita valores de varios caracteres para RS.

Respuesta2

$ awk '/^data/ { lines = ""; next } { lines = (lines == "" ? $0 : lines ORS $0) } END { print lines }' file
I J
K L
M N

Esto se utiliza awkpara obtener el contenido de la entrada después de la última línea que comienza con la cadena data. Esto se hace guardando cada sección de líneas después de dicha línea en la linesvariable. Cada vez que datase encuentra una línea que comienza con , esta variable se vacía. El valor de la variable se imprime al llegar al final de la entrada.


Usando sed:

$ sed -n 'H;${ x; s/.*\ndata\n//p; }' file
I J
K L
M N

Agregamos todas las líneas al espacio de espera. Cuando se encuentra la última línea, el espacio de retención se intercambia en el espacio del patrón y todo hasta la cadena data(flanqueada por una nueva línea en cada lado) se elimina antes de que se impriman los bits restantes.


Usando ed:

$ printf "?^data?ka\n1,'ad\n,p\nQ\n" | ed -s file
I J
K L
M N

o,

ed -s file <<END_ED
?^data?ka
1,'ad
,p
Q
END_ED

Aquí, primero buscamos hacia atrás la última aparición de la cadena dataal comienzo de una línea y etiquetamos esa línea (a lo que llamamos etiqueta a). Luego eliminamos desde el inicio del búfer hasta la línea etiquetada. Simplemente ,pgenera el contenido completo del búfer.

Sin GNU ed, probablemente no sea necesario el final Q(salir sin guardar).

Respuesta3

Para dividir registros en "datos" en lugar de una nueva línea, configure la variable RS (separador de registros).

Solo le interesa el cuarto registro (el primer registro está antes del primer "dato"; está vacío), así que imprima solo cuando NR sea 4.

cat file | awk 'BEGIN {RS="data\n"}; NR==4 {print}'

Respuesta4

Hecho por el método siguiente y funcionó bien Comando:

tac file.txt|sed -n '1,/data/p'| tac| sed -n '2,$p'

producción

 I J
 K L
 M N

información relacionada