아래와 같이 큰 데이터 세트가 있습니다.
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