
以下のような大きなデータセットがあります。
35.7337 408 0.5
35.732 407 0.5
35.7301 406 0.5
35.7281 405 0.5
35.7259 404 0.5
35.7236 403 0.5
35.7212 402 0.5
35.7187 401 0.5
35.7162 400 0.5
35.7136 399 0.5
35.711 398 0.5
35.7085 397 0.5
35.706 396 0.5
35.7036 395 0.5
35.7013 394 0.5
35.6992 393 0.5
これで、列1の最大値を求めたいと思います。列2が400より小さい値と列2が400より大きい列1の最大値のみを求めたいと思います。 2列と1列には負の値はありません。推定結果は$ 2 = = 400から離れている必要があるため、列2 = = 400は必要ありません。
だから私が望む結果
35.7136 (second column value <400)
35.7337 (second column value > 400)
答え1
ユーザーcsvsql
~からcsvkit
:
csvsql -HS -d' ' --query 'select max(a) from file where b<400' file
タブ区切りコンテンツの場合は-t
代わりに使用してください。-d' '
またはawk
:
awk '
$2<400 && $1>max1{max1=$1}
$2>400 && $1>max2{max2=$1}
END {printf "%s (second column value < 400)\n%s (second column value > 400)\n",max1,max2}
' file
列1が負の場合はmax1が設定されていない場合は0に等しいmax1
ため、sumを初期化する必要があります。max2
$1>max1
答え2
テストを経てうまく機能しました
注文する
awk 'BEGIN{sum=0}($2 < 400 && $1 > sum){sum=$1}END{print sum}' filename;awk 'BEGIN{sum=0}($2 > 400 && $1 > sum){sum=$1}END{print sum}' filename
出力
35.7136
35.7337
答え3
使用ミラー
$ mlr --nidx --repifs filter '$2 < 400' then stats1 -a max -f 1 data
35.713600
$ mlr --nidx --repifs filter '$2 > 400' then stats1 -a max -f 1 data
35.733700