사이트, 유형 및 사이트/유형별 개수가 포함된 데이터 파일이 있습니다. 전체 파일에는 각각 최소 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