Como usar o awk para dividir a linha (registro)?

Como usar o awk para dividir a linha (registro)?

Arquivo:

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

Resultado desejado:

I J
K L
M N

Como dividir por “dados”? Tenho pesquisado no Google sobre como usar o awk, mas a maior parte do awk relativo é dividida na coluna.

Responder1

Para usar datacomo separador de registros e imprimir o último registro:

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

I J
K L
M N

Isso requer um awk, como GNU awk (gawk) ou mawk, que suporte valores de vários caracteres para RS.

Responder2

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

Isso é usado awkpara obter o conteúdo da entrada após a última linha que começa com a string data. Isso é feito salvando cada seção de linhas após essa linha na linesvariável. Cada vez que uma linha que começa com dataé encontrada, esta variável é esvaziada. O valor da variável é impresso ao chegar ao final da entrada.


Usando sed:

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

Adicionamos todas as linhas ao espaço de espera. Ao encontrar a última linha, o espaço de espera é trocado no espaço padrão e tudo até a string data(flanqueada por uma nova linha em cada lado) é removido antes que os bits restantes sejam impressos.


Usando ed:

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

ou,

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

Aqui, primeiro pesquisamos de trás para frente a última ocorrência da string datano início de uma linha e rotulamos essa linha (o que chamamos de label a). Em seguida, excluímos desde o início do buffer até a linha rotulada. O ,psimplesmente exibe o conteúdo completo do buffer.

Com non-GNU ed, o final Q(sair sem salvar) provavelmente não é necessário.

Responder3

Para dividir registros em "dados" em vez de uma nova linha, defina a variável RS (separador de registros).

Você está interessado apenas no quarto registro (o primeiro registro está antes dos primeiros "dados"; está vazio), então imprima somente quando NR for 4.

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

Responder4

Feito pelo método abaixo e funcionou bem Comando:

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

saída

 I J
 K L
 M N

informação relacionada