다음과 같은 입력이 있습니다.
Fred apples 20
Susy oranges 5
Mark watermellons 12
Robert pears 4
Robert oranges 17
Terry oranges 9
Lisa peaches 7
Susy oranges 12
Mark grapes 39
Anne mangoes 7
Greg pineapples 3
Oliver rockmellons 2
Betty limes 14
나는 다음과 같은 출력을 원합니다 :
Anne:
mangoes 7
Oliver:
rockmellons 2
Greg:
pineapples 3
Mark:
watermellons 12
grapes 39
Terry:
oranges 9
Susy:
oranges 17
Lisa:
peaches 7
Fred:
apples 20
Robert:
oranges 17
pears 4
Betty:
limes 14
이 작업을 수행하기 위해 awk 명령을 사용하려고 합니다. 내 코드는 다음과 같습니다
{
lines[$1] = (lines[$1] ? lines[$1] "\n " $2 " " $3 : $1 ":\n " $2 " " $3)
}
END {
for (line in lines) print lines[line]
}
두 번째 열의 중복 항목을 비교하고 숫자를 합산하고 싶습니다.
답변1
배열의 배열이 있는 GNU awk를 사용하십시오(gawk 버전 4가 필요할 수 있음).
gawk '
NF { n[$1][$2] += $3 }
END {
for (name in n) {
print name ":"
for (fruit in n[name])
printf "%16s %2d\n", fruit, n[name][fruit]
}
}
'
답변2
출력을 정렬해도 괜찮다면 현재 사람과 현재 과일을 추적하고 무언가 변경될 때까지 합계를 계산할 수 있습니다.
#!/usr/bin/awk -f
NF {
if (who != $1) {
if (count > 0) {
printf "%16s %2d\n", fruit, count
}
who = $1
printf "%s:\n", who
fruit = ""
count = 0
}
if (fruit != $2) {
if (count > 0) {
printf "%16s %2d\n", fruit, count
}
fruit = $2
count = $3
} else {
count += $3
}
}
END {
printf "%16s %2d\n", fruit, count
}
이것을 먹이세요 sort -k1,1 -k2,2
:
sort -k1,1 -k2,2 file.txt | ./script.awk