範囲を使用して3つのフィルタを渡します。

範囲を使用して3つのフィルタを渡します。

ファイルがあります。sample.txt

-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:RAM      SAM 
    XY       DUPL
    KEY:UU
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

キーワードに基づいて注文をフィルタリングord:chandruし、key:ZZこれらの項目が見つかったら、ハイフンからハイフンまでの順序を削除して、次の出力を提供します。

-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

ベストアンサー1

GNUがある場合は、awk以下をお勧めします。

gawk 'BEGIN{RS="-+\n"} $0=="" || /ord:chandru/ && /KEY:ZZ/ {ORS=RT; print}' sample.txt
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

空のレコードを強制的に$0==""印刷します(レコードがハイフン文字列で区切られていると思われる場合は、ファイルの最初の行が解釈される方法です)。


もしあなたならいいえはいgawk、その場合の唯一の違いは、レコード区切り文字を簡単にキャプチャできないことです。これは固定文字列なので、提供した例では大きな問題ではありません。例えばmawk:

mawk 'BEGIN{RS="-------------\n"; ORS=RS} $0=="" || /ord:chandru/ && /KEY:ZZ/ {print}' sample.txt
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------
ord:chandru  SAM 
    XY       DUPL
    KEY:ZZ
-------------

おすすめ記事