特定の列のパターンを検索して行全体を出力します。

特定の列のパターンを検索して行全体を出力します。

私は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

答え1

最も簡単な方法はおそらく次のとおりですawk

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

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

他のオプションは次のとおりです。

  • 真珠

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

    同じ考えです。この-aスイッチは入力フィールドをperl与えられた値に従って配列に-F分割します@F。次に、配列(配列計算はゼロから始まる)の4番目の要素(フィールド)がで始まるかどうかを印刷します5

  • grep

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

    正規表現は、後に a が 3 回、その後|に がない文字列と一致します。|5

  • GNUまたはBSDsed

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

    -E拡張正規表現を有効にし、-n一般出力を抑制します。正規表現は上記と同じで、grep最後のp正規表現はsed正規表現に一致する行だけを印刷します。

答え2

これにより、一致するすべての行が印刷され、行の最後まで|5印刷されません。|

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

答え3

CSV認識ツールを使用して|埋め込み文字と改行フィールドを含むCSVファイルの問題を解決するには、次の方法を使用できますmlr(Miller)。

mlr --csv --fs '|' -N filter -S '${4} =~ "^5"' file

これにより、フィールド区切り文字を使用してmlr生データをヘッダーなしのCSVファイルに読み込むことができます。フィルタ式を適用して、式が真のレコードを抽出します。これはデータ型の推論を避け、データを文字列として扱います(正規表現は通常文字列でのみ機能するため)。|--csv --fs '|' -N-S

^5この式は、レコードの4番目のフィールドの正規表現と一致します。

抽出されたレコードは、入力と同じフィールド区切り文字を使用してCSV形式で再生されます。

csvkitパッケージのツールを使用して同じ操作を実行できますが、出力にカスタムフィールド区切り文字を使用するように指示できないため、区切り文字を保持するには結果のcsvgrep形式を再指定する必要があります。csvformat|

csvgrep -d '|' -H -c 4 -r '^5' file | csvformat -K 1 -D '|'

で生成された匿名ヘッダー行をスキップする-K 1オプションです。csvformatcsvgrep

答え4

使用幸せ(以前のPerl_6)

~$ raku -ne '.put if .split("|")[3].starts-with("5");' file

入力例:

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

-neつまり、Rakuはnフラグを使用してコマンドラインから入力を1行ずつ読み込むように指示されます(自動印刷がないことを意味します)。垂直バー(4番目の列など)にゼロのインデックス-rd要素があるput場合、その行は行外です。split|3starts-with("5")

より複雑なCSVファイルの場合は、RakuText::CSVモジュールを使用してください。

https://unix.stackexchange.com/a/705099/227738
https://raku.org

関連情報