他のパターンと一致する行を除き、パターン一致の前後の一部の行を印刷します。

他のパターンと一致する行を除き、パターン一致の前後の一部の行を印刷します。

私は、パターンマッチングの前後に5行を印刷するためにSolarisでawkを使用しています。現在、次の1行のコードがアクションを実行しています。

/usr/xpg4/bin/awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=5 a=5 s="ERROR" file

しかし、結果は満足できなかった。まず、次のような不要な行が含まれています。

  • ゲーム自体に関連するセリフ
  • 空行
  • (不要な)パターンに一致する行。
    • 削除する
    • 無意味な言葉
    • 愚かな

また、各塩基はダッシュを含む線で区切る必要があります。

入力例:

stupid
remove

keep it
*
MATCH
keep it as well



remove

important
                                                     *
MATCH at line 2:
needed
also

this line should be kept
                                                     *
MATCH at line 2:
this to save
very important



remove

keep it
*
MATCH
keep it as well

nonsense
another nonsense

予想出力:

keep it
keep it as well
---
important
needed
also
---
this line should be kept
this to save
very important
---
keep it
keep it as well

エレガントな方法で実装するには?

答え1

まだ予想される出力は明確ではありませんが、試してみましょう。 Solarisにgnuユーティリティがある場合は、非常に簡単な方法でgawkとggrepを使用できます。

gawk 'NF > 0' fileName  |ggrep -C5 pattern

不要な単語をフィルタリングするには、最後に| ggrep -v somePatternを追加できます。

関連情報