다음과 같이 ";"으로 구분된 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