2015-02-03 2 views
-1

아래의 입력 파일에 대한 중간 값을 계산해야합니다. 이상한 경우에는 제대로 작동하지만 짝수 때는 발생하지 않습니다. 아래는 입력 파일과 사용 된 스크립트입니다. 이 명령에 무엇이 잘못되었는지 확인하고 동일하게 수정하십시오.유닉스에서의 중앙값 계산

입력 파일 :

col1,col2 
AR,2.52 
AR,3.57 
AR,1.29 
AR,6.66 
AR,3.05 
AR,5.52 

원하는 출력 :

AR,3.31 

유닉스 명령을

cat test.txt | sort -t"," -k2n,2 | awk '{arr[NR]=$1} END { if (NR%2==1) print arr[(NR+1)/2]; else print (arr[NR/2]+arr[NR/2+1])/2}' 
+0

다음은 'awk -F', NR> 1 {a [++ x] = $ 2} END {asort (a); print (x % 2)? a [(x/2) +0.5] (a [x/2] + a [(x/2) +1])/2} '' –

+0

스크립팅 언어를 사용하십시오. "2.52e-3"과 같은 부동 소수점 숫자는 사전적인 정렬을 어지럽 힙니다. –

답변

1

헤더를 포함하여 입력 파일이 추가 라인을 가지고 잊지 마세요 . 첫 번째 행을 건너 뛰려면 awk 스크립트에서 추가 단계를 수행해야합니다.

또한 기본 필드 구분 기호를 사용하고 있기 때문에 $1에는 전체 줄이 포함되므로 코드 arr[NR/2]+arr[NR/2+1])/2은 절대로 작동하지 않습니다. awk가 입력을 쉼표로 분리하고 두 번째 필드 $2을 사용하도록 변경 한 것이 좋습니다.

sort -t, -k2n,2 file | awk -F, 'NR>1{a[++i]=$2}END{if(i%2==1)print a[(i+1)/2];else print (a[i/2]+a[i/2+1])/2}' 

또한 쓸데없는 고양이 사용을 제거했습니다. sort 및 awk를 포함한 대부분의 도구는 파일을 직접 읽을 수 있으므로 cat을 사용할 필요가 없습니다.

것은 그것을 테스트 :

$ cat file 
col1,col2 
AR,2.52 
AR,3.57 
AR,1.29 
AR,6.66 
AR,3.05 
AR,5.52 
$ sort -t, -k2n,2 file | awk -F, 'NR>1{a[++i]=$2}END{if(i%2==1)print a[(i+1)/2];else print (a[i/2]+a[i/2+1])/2}' 
3.31 

당신이 원하는대로에 출력을 변경하는 약간 스크립트를 수정 너무 어렵지 않을 것이다.

관련 문제