AWK를 사용하여 특정 수준(예: 처음 2개 값)에서 집계

AWK를 사용하여 특정 수준(예: 처음 2개 값)에서 집계

사이트, 유형 및 사이트/유형별 개수가 포함된 데이터 파일이 있습니다. 전체 파일에는 각각 최소 4가지 유형의 여러 사이트가 있습니다. 제가 하고 싶은 일은 각 웹사이트의 상위 2가지 유형을 요약해서 인쇄하는 것입니다. 내 샘플 데이터 파일은 다음과 같습니다.

Site|Type|Count
site1|A|1 
site1|B|25 
site1|B|66 
site1|D|22 
site1|B|22 
site1|A|45 
site1|A|55 
site1|C|50 
site1|C|55 
site1|A|6 
site1|A|30 
site2|B|21 
site2|D|362 
site2|A|36 
site2|C|2 
site2|A|4 
site2|A|69 
site3|B|36 
site3|C|62 
site3|D|541 
site3|C|55 
site3|A|52 
site3|A|63 
site3|A|52
site4|B|52 
site4|B|55 
site4|D|52 
site4|C|25 
site4|B|55 
site4|A|55 

출력은 다음과 같아야 합니다.

site1|A|137 
site1|B|113 
site2|A|109 
site2|D|362 
site3|A|167 
site3|D|541 
site4|A|55 
site4|B|162

현재 AWK 프로그램은 다음과 같습니다.

BEGIN {
  FS="|"
}
{
  site=$1
    type=$2
    nums=$3+0

    key=site","type

    ++recs[key]

    tot[key]+=$3 
}
END {
  for (i in recs) {print i "," tot[i]}
}

사이트 및 유형별로 처음 두 값을 찾아 인쇄할 수 있도록 사이트/유형별 총계 배열을 만드는 데 도움을 줄 수 있는 사람이 있나요?

답변1

배열의 배열과 sorted_in을 처리하려면 GNU awk를 사용하십시오.

$ cat tst.awk
BEGIN { FS=OFS="|" }
NR > 1 {
    tot[$1][$2] += $3
}
END {
    PROCINFO["sorted_in"] = "@val_str_asc"
    for ( site in tot ) {
        cnt = 0
        PROCINFO["sorted_in"] = "@val_num_desc"
        for ( type in tot[site] ) {
            if ( ++cnt < 3 ) {
                print site, type, tot[site][type]
            }
        }
    }
}

$ awk -f tst.awk file
site1|A|137
site1|B|113
site2|D|362
site2|A|109
site3|D|541
site3|A|167
site4|B|162
site4|A|55

관련 정보