단일 명령으로 숫자 목록의 최소값, 최대값, 중앙값 및 평균을 얻는 방법이 있습니까?

단일 명령으로 숫자 목록의 최소값, 최대값, 중앙값 및 평균을 얻는 방법이 있습니까?

파일에 한 줄에 하나씩 숫자 목록이 있습니다. 최소값, 최대값을 어떻게 구할 수 있나요?중앙값그리고평균가치? bash 스크립트에서 결과를 사용하고 싶습니다.

현재 상황은 정수에 대한 것이지만 결국에는 부동 소수점 솔루션이 유용할 것이지만 간단한 정수 접근 방식도 괜찮을 것입니다.

답변1

GNU와 함께데이터 혼합:

$ printf '%s\n' 1 2 4 | datamash max 1 min 1 mean 1 median 1
4   1   2.3333333333333 2

답변2

당신은 그것을 사용할 수 있습니다R 프로그래밍 언어.

빠르고 더러운 R 스크립트는 다음과 같습니다.

#! /usr/bin/env Rscript
d<-scan("stdin", quiet=TRUE)
cat(min(d), max(d), median(d), mean(d), sep="\n")

표준 입력(예: 파이프 또는 리디렉션)에서 읽은 특수 파일 이름은 어디에 "stdin"있습니까 ?scan

이제 stdin을 통해 데이터를 R 스크립트로 리디렉션할 수 있습니다.

$ cat datafile
1
2
4
$ ./mmmm.r < datafile
1
4
2
2.333333

부동 소수점에서도 작동합니다.

$ cat datafile2
1.1
2.2
4.4
$ ./mmmm.r < datafile2
1.1
4.4
2.2
2.566667

R 스크립트 파일을 작성하지 않으려면 다음을 사용하여 명령줄에서 실제 단일 코드 줄을 호출할 수 있습니다(가독성을 위해 줄 바꿈만 사용) Rscript.

$ Rscript -e 'd<-scan("stdin", quiet=TRUE)' \
          -e 'cat(min(d), max(d), median(d), mean(d), sep="\n")' < datafile
1
4
2
2.333333

아름다운 R 매뉴얼을 읽어보세요:http://cran.r-project.org/manuals.html.

안타깝게도 전체 참조 자료는 PDF로만 제공됩니다. 참조를 읽는 또 다른 방법은 ?topicname대화형 R 세션에서 프롬프트를 입력하는 것입니다.


완전성을 기하기 위해 원하는 모든 값과 그 이상을 출력할 수 있는 R 명령이 있습니다. 불행하게도 인간에게 친숙한 형식에서는 프로그래밍 방식으로 구문 분석하기가 어렵습니다.

> summary(c(1,2,4))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   1.500   2.000   2.333   3.000   4.000 

답변3

나는 실제로 숫자 데이터(음수 포함)의 단일 열의 합계, 개수, 최소값, 최대값, 평균 및 중앙값을 제공하는 awk 프로그램을 유지합니다.

#!/bin/sh
sort -n | awk '
  BEGIN {
    c = 0;
    sum = 0;
  }
  $1 ~ /^(\-)?[0-9]*(\.[0-9]*)?$/ {
    a[c++] = $1;
    sum += $1;
  }
  END {
    ave = sum / c;
    if( (c % 2) == 1 ) {
      median = a[ int(c/2) ];
    } else {
      median = ( a[c/2] + a[c/2-1] ) / 2;
    }
    OFS="\t";
    print sum, c, ave, median, a[0], a[c-1];
  }
'

위 스크립트는 표준 입력에서 읽고 탭으로 구분된 출력 열을 한 줄에 인쇄합니다.

답변4

awk를 사용하면 최소값, 최대값, 평균값을 쉽게 얻을 수 있습니다.

% echo -e '6\n2\n4\n3\n1' | awk 'NR == 1 { max=$1; min=$1; sum=0 }
   { if ($1>max) max=$1; if ($1<min) min=$1; sum+=$1;}
   END {printf "Min: %d\tMax: %d\tAverage: %f\n", min, max, sum/NR}'
Min: 1  Max: 6  Average: 3,200000

중앙값을 계산하는 것은 약간 까다롭습니다. 숫자를 정렬하고 잠시 동안 모두 메모리에 저장하거나 두 번 읽어야 하기 때문입니다(첫 번째는 계산하고 두 번째는 중앙값을 구함). 다음은 모든 숫자를 메모리에 저장하는 예입니다.

% echo -e '6\n2\n4\n3\n1' | sort -n | awk '{arr[NR]=$1}
   END { if (NR%2==1) print arr[(NR+1)/2]; else print (arr[NR/2]+arr[NR/2+1])/2}' 
3

관련 정보