Linuxには、次の内容を含むファイルがあります。 col3列の日付値に基づいて、毎月最大日付値を持つ行を印刷したいと思います。データは col3 に基づいて降順にソートされました。
col1|col2|col3
abc|xyz|2024-02-29
hds|fsfs|2024-02-28
fdg|sffe|2024-02-27
dfr|jfdfd|2024-01-31
fdf|gfgfg|2024-01-30
fdg|rgrg|2023-12-31
fgf|yjyjy|2023-12-30
gfgf|hhfdfd|2023-11-28
gfgfg|uysdfd|2023-11-27
予想出力:
abc|xyz|2024-02-29
dfr|jfdfd|2024-01-31
fdg|rgrg|2023-12-31
gfgf|hhfdfd|2023-11-28
ベストアンサー1
そしてミラー( mlr
)file
、フィールド区切り文字として(パイプ)を使用して名前付きCSVファイルにデータを読み込むと、フィールド|
から年と月を解析し、col3
各年と月の組み合わせの最初の値を取得できます。
mlr --csv --fs pipe \
put 'd = splita($col3, "-"); $y=d[1]; $m=d[2]' then \
head -n 1 -g y,m then \
cut -x -f y,m file
ミラーput
表現、
d = splita($col3, "-");
$y = d[1];
$m = d[2];
d
...日付スタンプをダッシュに分割して一時的な配列を作成します。次に、パーティションに2つの新しいフィールドy
(年)と(月)を作成します。m
次に、head -n 1 -g y,m
各年+月グループの最初の値を取得します。
cut
最終操作では、y
不要になったフィールドを削除します。m
データがソートされていない場合は、最初(または少なくとも前)に追加のhead
ソートステップを適用する必要があります。
mlr --csv --fs pipe \
sort -r col3 then \
put 'd = splita($col3, "-"); $y=d[1]; $m=d[2]' then \
head -n 1 -g y,m then \
cut -x -f y,m file
ヘッダーなしのCSV出力を取得するには、対応するmlr
(--headerless-csv-output
または--ho
)オプションと一緒に使用してください。
与えられたデータの実行例:
$ mlr --csv --fs pipe --headerless-csv-output sort -r col3 then put 'd = splita($col3, "-"); $y=d[1]; $m=d[2]' then head -n 1 -g y,m then cut -x -f y,m file
abc|xyz|2024-02-29
dfr|jfdfd|2024-01-31
fdg|rgrg|2023-12-31
gfgf|hhfdfd|2023-11-28