web-dev-qa-db-ja.com

特定の列でパターンを検索し、行全体を出力する

私はHDFSで作業していて、4番目の列が5で始まる行全体を取得しようとしています。

100|20151010|K|5001
695|20151010|K|1010
309|20151010|R|5005
410|20151010|K|5001
107|20151010|K|1062
652|20151010|K|5001

したがって、出力する必要があります:

100|20151010|K|5001
309|20151010|R|5005
410|20151010|K|5001
652|20151010|K|5001
7
Kit Goodman

最も簡単な方法は、おそらくawkです。

awk -F'|' '$4~/^5/' file

-F'|'は、フィールド区切り記号を|に設定します。 4番目のフィールドが$4~/^5/で始まる場合、5はtrueになります。何かがtrueと評価された場合のawkのデフォルトのアクションは現在の行を印刷することなので、上記のスクリプトは必要なものを印刷します。

その他の選択肢は次のとおりです。

  • Perl

    Perl -F'\|' -ane 'print if $F[3]=~/^5/' file
    

    同じ考え。 -aスイッチを指定すると、Perl-Fで指定された値の入力フィールドを配列@Fに分割します。次に、配列の4番目の要素(フィールド)(配列は0からカウントを開始)が5で始まる場合に出力します。

  • grep

    grep -E  '^([^|]*\|){3}5' file 
    

    正規表現は、|以外の文字列と、その後に|を3回、次に5を照合します。

  • GNUまたはBSD sed

    sed -En '/([^|]*\|){3}5/p' file 
    

    -Eは拡張正規表現をオンにし、-nは通常の出力を抑制します。正規表現は上記のgrepと同じで、最後のpsedが正規表現に一致する行のみを出力するようにします。

6
terdon

これにより、|5に一致するすべての行が出力され、その行の終わりまで|は表示されなくなります。

grep '|5[^|]*$' <in >out
1
mikeserv