我有一个很大的数据集,如下所示:
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
现在,我想获得column1的最大值;仅在column2小于400的值以及column2大于400的column1的最大值中。第2列和column1中没有负值。不需要列 2==400,因为预期结果应远离 $2==400。
所以我想要的输出
35.7136 (second column value <400)
35.7337 (second column value > 400)
答案1
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
和max2
,因为如果未设置,则 的 max1 等于 0 $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