【发布时间】:2018-09-05 22:08:14
【问题描述】:
我有一个格式如下的文件:
Total:89.3
User: user1
Count:3
Sum:80
departmentId: dept1
Amount by departmentId: 20
departmentId: dept1
Amount by departmentId: 35
departmentId: dept2
Amount by departmentId: 25
User: user2
Count:3
Sum:7.199999999999999
departmentId: dept1
Amount by departmentId: 2.4
departmentId: dept2
Amount by departmentId: 2.4
departmentId: dept3
Amount by departmentId: 2.4
User: user3
Count:1
Sum:0.2
departmentId: dept2
Amount by departmentId: 0.2
User: user4
Count:2
Sum:2
departmentId: dept3
Amount by departmentId: 1
departmentId: dept3
Amount by departmentId: 1
文件列表基本上是一个部门的用户会费。如果同一用户多次归于一个部门,则需要将其合并到一行中。输出文件需要采用以下格式。 对于用户 1,他有 2 个部门的应付款和 1 个部门的应付款。因此,在输出文件中,需要将 dept1 的 2 个会费合并为 1 个计数需要为 no。每个部门的唯一用户数。
Format:
count_of_uique_user_dept_rows total_sum -- note** header row-->total sum and total no. of unique user dues
userId+deptId sum for that dept
Example:
7 89.3
user1dept1 55
user1dept2 25
user2dept1 2.4
user2dept2 2.4
user2dept3 2.4
user3dept2 0.2
user4dept3 2
目前为止,
# This awk script is used to convert the input of library credit/debit's to the required Student Accounts Load format
BEGIN { FS=": *" }
{
gsub(/^ +| +$/,"")
f[$1] = $2
}
/Amount/ {
dept = f["departmentId"]
total = f["Total"]
sum[dept] += $2
amount += $2
}
$1 == "User" {
if (NR>1) {
format()
}
user = $2
}
END { format() }
function format() {
if ( length(sum) > 0 ) {
for (dept in sum) {
printf "%-9s%-12s%10.2f\n", substr(user,1,9), substr(dept,1,12), sum[dept]
}
delete sum
amount = 0
}
}
上面的脚本给了我们数据行。我无法弄清楚如何获得 7 89.3 的标题行请帮助。
【问题讨论】:
-
usrdpt[user,dept]每当看到 dept 时。在末尾打印length(usrdpt)。 -
我可以在哪里打印?因为这只需要打印一次,在标题上
-
是的,我只是在增强现有功能。 awk 新手,试图理解它。
-
从一个文件中读取,所以我们可以读取两次。会试一试。谢谢