从列生成最大值,该值取决于另一列的范围

从列生成最大值,该值取决于另一列的范围

我有一个很大的数据集,如下所示:

 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

用户csvsqlcsvkit

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 列可以为负数,则必须初始化max1max2,因为如果未设置,则 的 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

相关内容