一致しないパターン間の線を除き、パターン間の線を印刷します。

一致しないパターン間の線を除き、パターン間の線を印刷します。

だから、次のような入力があります。

start 
abcd
sfd 
afsdaf
afsaf
end 1

start 
sdfo
efsf
end 0

start 
sdf
efsf
end 2

したがって、開始と終了(含む)の間の行だけを印刷したいが、行の2番目のフィールドがend0より大きい場合にのみ印刷したいと思います(したがって、startand end 1startandの間、andの間end 2ではありません)。私ができる方法はありますか?startend 0

答え1

$ awk -v RS= -v ORS='\n\n' '$NF' file
start
abcd
sfd
afsdaf
afsaf
end 1

start
sdf
efsf
end 2

レコードは空行で区切られており、すべて「start」で始まり「end」で終わるため、「start」で始まり「end」で終わるという事実は不適切です。私たちが考慮する必要があるのは、上記のように、各空行で区切られた段落の最後のスペースで区切られたフィールドがゼロではないことです。If RS is nullから探すhttps://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.htmlRS=何をすべきかわからない場合。

答え2

awk '
/start/ { toprint=$0 ; save=1; next }
save { toprint = toprint "\n" $0 ; } 
/end/ {if (($2> 0) && save) { print toprint ;} save=0 }'

「開始」行が表示されたら、保存を開始してください。保存するには、印刷する内容にデータを追加してください。 「終了」行が表示されている場合は保存していて、2番目のフィールドが0より大きい場合は、現在存在している内容を印刷して保存を中止してください。

関連情報