유일한 줄을 깨우고 위의 2줄을 인쇄하는 방법

유일한 줄을 깨우고 위의 2줄을 인쇄하는 방법

awk를 사용하여 줄을 찾고 그 위에 두 줄을 인쇄하는 데 문제가 있습니다.

파일 test.txt 파일은 다음과 같습니다”

{ 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 }

제가 찾고 있는 라인은 다음과 같습니다.

create table "sacro".issue

내가 실행하는 명령은 다음과 같습니다.

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'

명령을 실행하면 create table "sacro".issue_category 줄을 찾습니다. grep -w를 사용하는 것처럼 필요한 줄을 찾기 위해 grep을 수행하는 방법이 있습니까? 불행하게도 다음 grep 명령은 HPUX에서 작동하지 않습니다.

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

내가 원하는 결과는 다음과 같습니다(헤더-1 사용).

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

답변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

답변2

우선, grep하지 못할 이유가 없습니다. 아, 그리고 가 필요하지 않으며 cat둘 다 파일 이름을 입력으로 grep허용합니다 .awk

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

create table "sacro".issue

따라서 첫 번째 행만 원하는 경우 다음을 수행하십시오.

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

이는 -x"전체 줄과 일치"를 의미하며 create table "sacro".issue_category해당 줄이 인쇄되지 않도록 합니다. 이는 -B2"처음 두 줄을 동시에 인쇄합니다.


awk다음 요구 사항을 따를 수도 있습니다.

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

관련 정보