awk는 열별로 그룹화하고 여러 값을 합산합니다.

awk는 열별로 그룹화하고 여러 값을 합산합니다.

"이름" 및 "수량" 열과 "가격" 열을 기준으로 그룹화하려고 합니다. 샘플 데이터는 다음과 같습니다.

names,fruits,qty,price
tom,banana,2,500
tom,banana,3,750
tom,apple,2,500
alex,banana,3,750
alex,melon,3,750
alex,melon,3,750
jess,banana,1,250
jess,banana,1,250
jess,banana,1,250
danny,melon,2,500
danny,apple,2,500
danny,apple,2,500

나는 다음 명령을 사용해 보았습니다.

awk -F, 'BEGIN{FS=OFS=","} 
            NR==1{print; next} 
            {
                q=$3; 
                $3="~";
                w=$4; 
                $4="~";
                a[$0]+=q;
                b[$0]+=w
            } 
       END  {
                for(k in a) 
                {
                    sub("~",a[k],k); 
                    sub("~",b[k],k);
                    print k
                }
            }' file

해당 명령을 사용하면 "가격" 열이 비어 있고 원하는 출력은 다음과 같습니다.

names,fruits,qty,price
alex,banana,3,750
tom,banana,5,1250
alex,melon,6,1500
jess,banana,3,750
danny,apple,4,1000
danny,melon,2,500
tom,apple,2,500

도움을 주셔서 미리 감사드립니다.

답변1

넌 할 수있어:

awk -F, -v OFS=, '
 NR==1{ print; next }
 { key=($1 OFS $2) }
 { grpByQty[key]+=$3; grpByPrice[key]+=$4 }
END{ for(key in grpByQty) print key, grpByQty[key], grpByPrice[key] }' infile

답변2

BEGIN {
    FS = OFS = ","
}

NR == 1 {
    print $0
    next
}

NR > 1 {
    ori = price[$1 "," $2]
    if (ori == "") {
        price[$1 "," $2] = $3 "," $4
    } else {
        split(ori, a, ",")
        price[$1 "," $2] = a[1] + $3 "," a[2] + $4
    }
}

END {
    for (name in price) {
        print name, price[name]
    }
}

namefruit","에 연결된 합을 키로 저장하고 quantity","에 연결된 합을 price값으로 저장하는 것이 아이디어입니다 .

관련 정보