毎月末日に基づいて行を印刷する方法

毎月末日に基づいて行を印刷する方法

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

おすすめ記事