一日の最高湿度に基づいて大容量CSVファイルをフィルタリングする方法は?

一日の最高湿度に基づいて大容量CSVファイルをフィルタリングする方法は?

何百万行ものデータがあるため、スプレッドシートではこれを行うことはできません。一部のデータ行にはデータがないため、これらのデータ行をスキップする必要があります。データは .CSV 形式です。すべてのUnixツールを歓迎します。区切り記号 ""のため、AWKかもしれません。

それはまるで

awk -F " " '{ print $1 $2 $3 $4}' filename.csv

しかし、毎日最高の湿度を得る方法は何ですか? 1つのオプションがありますが、動作しません。

awk -F, 'NR==1 {next} {date=$1; humidity=$2; if (!max[date] || humidity > max[date]) {max[date]=humidity; line[date]=$0}} END {for (date in line) print line[date]}' filename.csv

データ(Airthings View Plus - デバイス上)

recorded HUMIDITY %TEMP °C
2023-08-14 23:55:48 97.01 14.65
2023-08-14 23:55:50

2023-08-14 23:58:14 97.07 14.63
2023-08-14 23:58:16

2023-08-15 0:00:46 97.02 14.62
2023-08-15 0:00:48

2023-08-15 0:03:14 97.06 14.62
2023-08-15 0:03:16

ヘッド実データ

recorded,HUMIDITY %,TEMP °C
2023-08-14 16:55:56,97.64,14.62
2023-08-14 16:55:58,,
2023-08-14 16:58:13,97.41,14.76
2023-08-14 16:58:15,,
2023-08-14 17:00:45,97.04,14.88
2023-08-14 17:00:47,,
2023-08-15 17:03:12,96.78,15.26
2023-08-15 17:03:14,,
2023-08-15 17:05:45,96.59,14.89

希望の出力

recorded HUMIDITY %TEMP °C
2023-08-14 23:58:14 97.07 14.63
2023-08-15 0:03:14 97.06 14.62

オペレーティングシステム:Debian 12 Linux

ベストアンサー1

EX.3.feb.2024 - hum.t.p.day.csv注:Google DocsでOP全体を使用してこのアプローチを試しましたが、このcsvsqlアプローチは審美的に魅力的ですが、苦しい遅い(Millerソリューションより約600倍遅い)

あなたの例

$ cat input.csv
recorded,HUMIDITY %,TEMP °C
2023-08-14 16:55:56,97.64,14.62
2023-08-14 16:55:58,,
2023-08-14 16:58:13,97.41,14.76
2023-08-14 16:58:15,,
2023-08-14 17:00:45,97.04,14.88
2023-08-14 17:00:47,,
2023-08-15 17:03:12,96.78,15.26
2023-08-15 17:03:14,,
2023-08-15 17:05:45,96.59,14.89

csvsql次に、Pythonベースを使用します。csvkit:

$ csvsql --query '
    SELECT recorded,MAX("HUMIDITY %") AS "HUMIDITY %","TEMP °C" FROM input \
    WHERE "HUMIDITY %" NOT NULL GROUP BY DATE(recorded)
' input.csv
recorded,HUMIDITY %,TEMP °C
2023-08-14 16:55:56.000000,97.64,14.62
2023-08-15 17:03:12.000000,96.78,15.26

表形式の出力の場合、結果をパイプしますcsvformat -T


または、装飾 - 並べ替え - 装飾解除方法を使用してください。ミラー

$ mlr --csvlite filter '!is_empty(${HUMIDITY %})' then \
    put '$day = splitnvx($recorded, " ")[1]' then \
    top -a -F -f 'HUMIDITY %' -g day then \
    cut -x -f day input.csv
recorded,HUMIDITY %,TEMP °C
2023-08-14 16:55:56,97.64,14.62
2023-08-15 17:03:12,96.78,15.26

その場合は、表形式で出力する場合--csvliteに に変更してください--icsvlite --opprint

おすすめ記事