파일에 한 줄에 하나씩 숫자 목록이 있습니다. 최소값, 최대값을 어떻게 구할 수 있나요?중앙값그리고평균가치? 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