私は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
最も簡単な方法は、おそらく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
と同じで、最後のp
はsed
が正規表現に一致する行のみを出力するようにします。
これにより、|5
に一致するすべての行が出力され、その行の終わりまで|
は表示されなくなります。
grep '|5[^|]*$' <in >out