백분율 추가 및 계산

백분율 추가 및 계산

두 개의 데이터 열이 있고 A열에 중복 레코드 수를 추가한 다음 B열에서 개수를 계산하고 개수 백분율을 계산하려고 합니다. 예:

494   1
494
494
494   1
500
500   1
500
501
501
501  1
501

494의 경우 4개의 레코드와 2개의 카운트가 있으므로 2/4 = 0.50 등을 계산하려고 합니다.

답변1

간단한 예로, 이것은 awk매우 복잡합니다.

{
  if (A!=$1) {   # This section has a different A-column
    if (a) {       # If a>0, then it is not the beginning
      print A,b/a  # Print result
    }
    A=$1;          # Re-init variables
    a=0;
    b=0
  }
  ++a;
  b += $2 ? 1 : 0
}

실행하려면 awk 스크립트 frac-calc와 숫자를 입력 number하고 실행하세요.

( cat number; echo ) | awk -E frac-calc

출력은 다음과 같습니다:

494 0.5
500 0.333333
501 0.25

이는 echo열 A가 다르기 때문에 마지막 블록(501)의 결과가 인쇄되도록 보장하기 때문에 필요합니다.

긴 목록일 수도 있습니다.

( cat number; echo ) | awk '{if(A!=$1){if(a){print A,b/a}A=$1;a=0;b=0}++a;b+=$2?1:0}'

편집하다: 댓글에 언급된 대로 사용 END하고 사용하지 않으려면 :echo

{
  if (A!=$1) {   # This section has a different A-column
    if (a) {       # If a>0, then it is not the beginning
      print A,b/a  # Print result
    }
    A=$1;          # Re-init variables
    a=0;
    b=0
  }
  ++a;
  b += $2 ? 1 : 0
}
END {
      print A,b/a  # Print result
}

그리고 그것을 호출하십시오 :

awk -E frac-calc number

그러면 단일 안감이 조금 더 길어집니다.

awk '{if(A!=$1){if(a){print A,b/a}A=$1;a=0;b=0}++a;b+=$2?1:0}END{print A,b/a}' number

답변2

첫 번째 버전 - 2D 배열을 사용합니다.

gawk '
BEGIN {
    PROCINFO["sorted_in"] = "@ind_num_asc";
}
{
    arr[$1][0]++;
    arr[$1][1] += $2;
}
END {
    for(i in arr) {
        print i, arr[i][1] / arr[i][0];
    }
}' input.txt

PROCINFO["sorted_in"] = "@ind_num_asc";줄에 대한 설명은 다음과 같습니다.미리 정의된 배열 스캔 순서 사용.

gawk이 경우 출력을 다음 명령으로 파이프하여 바꿀 수 있습니다 sort -n.

gawk '
{
    arr[$1][0]++;
    arr[$1][1] += $2;
}
END {
    for(i in arr) {
        print i, arr[i][1] / arr[i][0];
    }
}' input.txt | sort -n

두 번째 버전 - 배열이 없는 더욱 최적화된 변형입니다.

gawk '
NR == 1 { 
    record = $1;
}
record != $1 {
    print record, tallies / cnt;    
    record = $1;
    cnt = 0;
    tallies = 0;
}
{
    cnt++;
    tallies += $2;
}
END {
    print record, tallies / cnt;    
}' input.txt

산출:

494 0.5
500 0.333333
501 0.25

관련 정보