私は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またはBSD
sed
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
オプションです。csvformat
csvgrep
答え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
|
3
starts-with("5")
より複雑なCSV
ファイルの場合は、RakuText::CSV
モジュールを使用してください。
https://unix.stackexchange.com/a/705099/227738
https://raku.org