열을 합산하고 다른 열의 고유 값을 계산합니다.

열을 합산하고 다른 열의 고유 값을 계산합니다.

다음과 같이 ";"으로 구분된 4개의 열이 있는 파일이 있습니다.

Articles;Qty;Sales;Customers
ArticleA;2;6;Customer1
ArticleA;3;9;Customer2
ArticleA;5;15;Customer1
ArticleA;4;12;Customer1
ArticleB;1;2;Customer2
ArticleB;2;4;Customer1
ArticleC;3;3;Customer2

각 기사의 열 2와 열 3을 합산하고 싶습니다. 다음을 사용하여 이 작업을 수행할 수 있습니다.

awk -F ';' 'NR>1 {a[$1]+=$2; b[$1]+=$3} END {for (i in a) print i, a[i], b[i]}' File

하지만 이제는 이 기사를 구매한 고객이 몇 명인지도 알고 싶습니다. 불행히도 저는 할 수 없습니다. 누군가 내 awk 명령이 다음 결과를 얻기 위해 어떻게 작동해야 하는지 말해 줄 수 있습니까?

Articles;Qty;Sales;Count of different customers
ArticleA;14;42;2
ArticleB;3;6;2
ArticleC;3;3;1

답변1

awk실제 다차원 배열에 대한 GNU와 배열용 함수가 있다고 가정하면 length()다음을 수행할 수 있습니다.

gawk -F';' -v OFS=';' 'FNR==1{print "Articles;Qty;Sales;Count of different customers";next}
                       {qty[$1]+=$2;sls[$1]+=$3;cust[$1][$4]}
                       END{for (a in qty) {print a,qty[a],sls[a],length(cust[a])}}' input.ssv 

입력 파일의 결과는 다음과 같습니다.

Articles;Qty;Sales;Count of different customers
ArticleA;14;42;2
ArticleB;3;6;2
ArticleC;3;3;1

이 계획은

  • 첫 번째 줄을 그대로 인쇄하고 실행을 위해 다음 줄로 점프합니다.
  • 기사를 "배열 색인"으로 qty사용하여 연관 배열에 수량 및 판매 수치를 추가합니다.sls
  • 첫 번째 인덱스가 기사이고 두 번째 인덱스가 고객 이름인 2차원 배열에 각 고객을 등록합니다.

마지막으로 프로그램은 모든 기사(배열의 인덱스에서 가져온 qty)를 반복하고 기사, 총 수량, 총 판매량 및 해당 기사에 대한 고객 배열의 "길이"를 인쇄합니다. 이는 고객 수와 동일합니다. .

답변2

그리고 awk:

awk 'BEGIN{ FS=OFS=";" }
      NR>1{ s1[$1]+=$2; s2[$1]+=$3; c[$1, $4]=$1 }
END{
    print "Articles", "Qty", "Sales", "Count of different customers" 
    for(x in c) cs[c[x]]++; for(i in cs) print i, s1[i], s2[i], cs[i]
}' infile

관련 정보