Como awk linha única e imprimir 2 linhas acima

1

Estou enfrentando um problema em que estou usando o awk para encontrar uma linha e imprimir duas linhas acima

Dentro do arquivo test.txt está abaixo "

{ TABLE "sacro".issue row size = 149 number of columns = 9 index size = 0 }

{ unload file name = issue00106.unl number of rows = 74 }

create table "sacro".issue
( 
issue_no serial not null constraint "sacro".nnc_issue00,
user_logged varchar(8,1) not null constraint "sacro".nnc_issue01,
issue_status_code integer not null constraint "sacro".nnc_issue02,
issue_cat_code varchar(2) not null constraint "sacro".nnc_issue03,
issue_descr text not null constraint "sacro".nnc_issue04,
issue_feedback text,
user_action varchar(8,1),
date_logged date not null constraint "sacro".nnc_issue05,
date_compl date
);

revoke all on "sacro".issue from "public" as "sacro";

{ TABLE "sacro".issue_category row size = 104 number of columns = 2 index                        size = 8 }

{ unload file name = issue00107.unl number of rows = 5 }

create table "sacro".issue_category
(
issue_cat_code varchar(2) not null constraint "sacro".nnc_iss_cat00,
issue_cat_descr varchar(100),
primary key (issue_cat_code)  constraint "sacro".pkc_issuecategory
);

revoke all on "sacro".issue_category from "public" as "sacro";

{ TABLE "sacro".issue row size = 149 number of columns = 9 index size = 0 }

{ unload file name = issue00106.unl number of rows = 74 }

A linha que estou procurando está abaixo:

create table "sacro".issue

O comando que estou executando é:

cat test.txt | awk '{a[NR]=$0} $0~s {f=NR} END {for (i=f-B;i<=f+A;i++) print a[i]}' B=2 A=0 s='create table \"sacro\".issue'

Quando eu executo o comando, ele encontra a linha create table "sacro" .issue_category. Existe uma maneira de grep para a linha que eu preciso como se eu estivesse usando grep -w. Infelizmente, o comando grep abaixo não funciona no HPUX:

cat test.txt | grep -B 2 -w "create table \"sacro\".issue" | head -1

Meu resultado desejado deve ser (usando head -1):

{ unload file name = issue00106.unl number of rows = 74 }
    
por Christopher Karsten 03.05.2017 / 10:54

2 respostas

1

sed -e '
   1N                                  # get 2nd line in pattern space
   $!N                                 # get 3rd line in pattern space
   /\ncreate table "sacro"\.issue$/P   # if the last portion of matches, show 1st portion
   D                                   # strip 1st portion & reapply sed code on what
                                       # remains of the pattern space
' test.txt

grep -B 2 'create table "sacro"\.issue$' test.txt | sed q
    
por 03.05.2017 / 11:16
0

Primeiro de tudo, não há razão para que grep não possa fazer isso. Ah, e note que você não precisa de cat , tanto grep quanto awk podem receber nomes de arquivos de entrada:

$ grep -xB2 'create table "sacro".issue' file
{ unload file name = issue00106.unl number of rows = 74 }

create table "sacro".issue

Então, se você quiser apenas a primeira linha, faça:

$ grep -xB2 'create table "sacro".issue' file | head -n1
{ unload file name = issue00106.unl number of rows = 74 }

O -x significa "corresponde à linha inteira", o que garante que a linha create table "sacro".issue_category não seja impressa. O -B2 significa "imprimir as duas linhas anteriores também.

Você também pode fazer isso em awk , conforme solicitado:

$ awk -vs='create table "sacro".issue' '($0==s){print b2}{b2=b1; b1=$0}' file 
{ unload file name = issue00106.unl number of rows = 74 }
    
por 03.05.2017 / 11:24

Tags