2011-02-03 71 views
5

以下は私がawkを使ってやろうとしていることです。正規表現とマッチする行を取得し、マッチして印刷する直前の行を取得します。あなたは簡単にはgrepでそれを解決することができ、この場合にはawkの一致する行と行が一致する前に一致する

awk '{if ($0!~/^CGCGGCTGCTGG/) print $0}' 
+0

は考え線3,4が正規表現と一致します。 2,3,4を表示したいですか? –

答えて

10

grep -B1 foo file 

をしかし、あなたが使用する必要がある場合、私はその直前の正規表現ではなく、行にマッチした行を取得することができますAWK:

awk '/foo/{if (a && a !~ /foo/) print a; print} {a=$0}' file 
+0

awk 'はどうでしょうか?{if($ 0〜/> /)head = $ 0; getline} {if($ 0〜/ CGCGGCTGCTGG /)プリントヘッド "\ n" $ 0}' ..これは正しいですか? – Sudeep

+0

@ Sudeep:あなたはそれが正しいかどうかをテストすることで自分自身に言うことができます...しかし、それはマルコの提案よりも長くて分かりにくいので、どうして迷惑でしょうか? – Cascabel

+0

ありがとうございましたJeromi、はい、私はテストすることができます...私はですが、getlineはちょっと混乱していました。これが誰かがコマンドを見て、フラグを立てることができることを確認するために投稿しました:) – Sudeep

0

なぜgrep -EB1 '^CGCGGCTGCTGG'

を使用しません同じことをするのは非常に長時間です、マルコの答えを参照してください。たぶん少しオフトピック

+0

ありがとうMarcoとSolmojo..grepも機能し、ちょうどawkでやるのがやめました。 – Sudeep

+0

学習の練習として、それは良いことですが、grepも高速に実行され、バイオメトリクスではおそらく有用な機能です。 – ocodo

2
/abc/{if(a!="")print a;print;a="";next} 
{a=$0} 
+0

スクリプトで「bcd \ nabc \ nabcdef」のようなケースが正しく処理されない –

+0

これを考慮して修正されました。 –

1

使用より簡単なパターン検索

gawk '{if (/^abc$/) {print x; print $0};x=$0}' file1 > file2

0

が、私はを検索し、上記溶液の私自身のバリエーションを作成するために、ベリサリウスからの回答を使用Nthエントリを返し、前の行を返します。

awk -v count=1 '/abc/{{i++};if(i==count){print a;print;exit}};{a=$0}' file 
1

私は次のawkスクリプトを作成しました。一致する行だけでなく、前の2行も印刷します。あなたはこの考えからより柔軟にすることができます。

search.awk

{ 
    a[0]=$0; 
    for(i=0;i<2;i++) 
    { 
     getline; 
     if(i==0){ 
      a[1]=$0; 
     } 
     if(i==1){ 
      if($0 ~ /message received/){ 
       print a[0];  
       print a[1]; 
       print $0; 
      } 
     } 
    } 
} 

使用:

awk '{print $0}' LogFile.log | awk -f search.awk 
関連する問題