TITLE と DATA の 2 つのフィールドで構成されるレコードがあり、2 番目のフィールドが欠落している場合はレコードを削除したいと思われます。しかし、それはあなたが質問で尋ねたことではありません。したがって、ここにあなたが尋ねたことを行う1つの方法があります:
awk '/^TITLE/&&!t{t=$0} /^DATA/&&t{print t;print;t=""}' inputfile
ここでの考え方は、変数が表示されたときに TITLE を設定し、まだタイトル付きのセットがなく、DATA が表示されたときにのみ出力するというものです。あなたの質問を正しく読んでいれば、これはあなたが提供した入力データに対して機能します。出力は次のとおりです。
TITLE something
DATA some data
TITLE something else
DATA some other data
TITLE some more
DATA some more data
ご覧のとおり、データセットの最後の TITLE 行が削除されました。
そして、awkでこれを行う別の方法があります...
awk '/^TITLE/&&t{next} t=0; /^TITLE/{t=1} 1' inputfile
この例では、最初の式が設定されている場合、タイトルをスキップしt
ます。2 番目の式は設定を解除しt
ます。3 番目の式はタイトルの if を設定し、最後の式 ( 1
) は行を出力します。もちろん、最初の式の行をスキップした場合、最後の 3 つの式は実行されません。上記と同じ出力が生成され、わざわざ を確認する必要はありません/^DATA/
。
最後に、これは最小のコードですが、最も奇妙なロジックです。
awk '/^DATA/ || !t; {t=/^TITLE/}' inputfile
すべてのデータ行、またはt
設定されていない行を出力し、効果的t
にブール値に設定して、次の行の評価に影響を与えます。これを csh または tcsh で実行している場合は、感嘆符に注意してください。これらのシェルでは、感嘆符をエスケープする必要がある場合があります。