다른 열의 범위에 따라 달라지는 열에서 최대값 생성

다른 열의 범위에 따라 달라지는 열에서 최대값 생성

아래와 같이 큰 데이터 세트가 있습니다.

 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

관련 정보