2016-06-24 6 views
2

私はこのような内容のファイルを持っています。awkは開始マッチパターンの最後のマッチから最後のパターンまでを印刷します

if {[CELL NAME "CELL1"]} { 
define_cell \ 
     -pinlist { i0 i1 i2 0 } \ 
     CELL1 
} 
if {[CELL NAME "CELL2"]} { 
define_cell \ 
     -pinlist { i0 i1 i2 0 } \ 
     CELL2 
} 
define_cell \ 
     -pinlist { i0 i1 i2 0 } \ 
     CELL3 
define_cell \ 
     -pinlist { i0 i1 i2 0 } \ 
     CELL4 

私はこのようなサブセクションを取得しようとしています。私は以下のような簡単なスクリプトでそうしようとしていた場合

define_cell \ 
     -pinlist { i0 i1 i2 0 } \ 
     CELL3 

、私は実際に私の予想に反して、ファイルの最後までdefine_cellの最初の試合から取得しています。

awk '/define_cell/,/CELL3/{print $0}' <FILE> 

どのように具体的な目標を達成できますか。私はこの中で提案された解決策に従おうとしました。 awk find the last match and print the next N lines しかし、動作させることができません。

このような何かがうまくいくかもしれないGNU AWKで

答えて

2

awk '{$0=RT$0}/CELL3/' ORS= RS=define_cell input.txt 

上記define_cellにレコードを分割して、CELL3を含むレコードを印刷します。あなたはdefine_cellがマッチするたびにrに印刷し、それを削除するには、各ラインを保存する以下のように使用することができます

オルタナティブ:

awk '/define_cell/ { l=1; delete r} 
       l { r[l++]=$0 } 
      /CELL3/ { for(i=1;i<l;i++) print r[i] }' input.txt 

あなたが後ろからファイルを読み取るためにtacをも使用することができます

tac input.txt | awk '/CELL3/,/define_cell/' | tac 
+0

CELL4(リストの最後のもの)に最初のソリューションを使用すると問題が発生します。 define_cell行が欠落しています! これを修正する手がかりはありますか? 'bash-4.2 $ awk '{$ 0 = RT $ 0}/CELL4 /' ORS = RS = define_cell /tmp/input.txt \ -pinlist {i0 i1 i2 0} \ CELL4' – Pratap

0

grepとの単純な答え:

grep -A 2 "^define_cell" input.txt | grep -B 2 "CELL3" 

-A 2で最初のマッチの後に2行を抽出し、最後のマッチの前に2行を抽出するために-B 2を抽出すると、両方のマッチングが得られます。

関連する問題