唯一の行を目覚めさせ、上記の2行を印刷する方法

唯一の行を目覚めさせ、上記の2行を印刷する方法

awkを使用して行を検索し、その上に2行を印刷するのに問題があります。

ファイル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、「最初の2行を同時に印刷します。


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 }

関連情報