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 }