![获取 awk 中带有时间戳的条目总和](https://linux22.com/image/163135/%E8%8E%B7%E5%8F%96%20awk%20%E4%B8%AD%E5%B8%A6%E6%9C%89%E6%97%B6%E9%97%B4%E6%88%B3%E7%9A%84%E6%9D%A1%E7%9B%AE%E6%80%BB%E5%92%8C.png)
使用此输入:
08/22/2019 12:00:58
Name Cans Bucks Puns
Clyde 12 2 79
Sheila 32 16 42
Elmo 44 18 21
08/23/2019 19:00:22
Name Cans Bucks Puns
Clyde 18 21 46
Sheila 37 2 11
Elmo 41 3 10
我能够得到这个输出:
name=Clyde cans=12 bucks=2 puns=79 ts=1566475258
name=Sheila cans=32 bucks=16 puns=42 ts=1566475258
name=Elmo cans=44 bucks=18 puns=21 ts=1566475258
name=Clyde cans=18 bucks=21 puns=46 ts=1566586822
name=Sheila cans=37 bucks=2 puns=11 ts=1566586822
name=Elmo cans=41 bucks=3 puns=10 ts=1566586822
使用此代码:
awk -F'[/: ]' '{
if (NF==6){
ts=mktime($3" "$1" "$2" "$4" "$5" "$6)
skipheader=1
}
else if (NF==0 || skipheader){
skipheader=0
}
else {
print "name="$1,"cans="$2,"bucks="$3,"puns="$4,"ts="ts
}
}' file
然而,我遇到的问题是,如果输入具有同一时间戳的多个条目,而我只需要一个包含这些实例总和的输出,我该怎么办?
例如:
08/23/2019 19:00:22
Name Cans Bucks Puns
Sheila 37 2 11
...
Sheila 5 1 0
我们怎样才能得到这个输出总和?因此,不要像这样获得输出:
Name=Sheila Cans=37 Bucks=2 Puns=11 ts=1566567001
Name=Sheila Cans=5 Bucks=1 Puns=0 ts=1566567001
我可以获得这样的单个输出:
Name=Sheila Cans=42 Bucks=3 Puns=11 ts=1566567001
我只是不知道如何使用时间戳作为输出的条件。
答案1
这里我们使用三个数组来保存/累积值而不是打印它们。当处理下一个块时 ( NF=0
),打印前一个块的累加值并删除给定名称的数组元素。
请注意,块内打印行的顺序是任意的。退出之前需要 END 块来打印最后处理的块的值 - 这是重复的代码并且不优雅。
awk -F'[/: ]' '{
if (NF==6){
ts=mktime($3" "$1" "$2" "$4" "$5" "$6)
skipheader=1
}
else if (NF==0 || skipheader){
skipheader=0
if (NF==0) {
for (i in cans){
print "name="i,"cans="cans[i],"bucks="bucks[i],"puns="puns[i],"ts="ts
delete cans[i]; delete bucks[i]; delete puns[i]
}
}
}
else {
cans[$1]+=$2; bucks[$1]+=$3; puns[$1]+=$4
}
}
END{
for (i in cans) print "name="i,"cans="cans[i],"bucks="bucks[i],"puns="puns[i],"ts="ts
}' file
输入示例:
08/22/2019 12:00:58
Name Cans Bucks Puns
Clyde 12 2 79
Sheila 32 16 42
Elmo 44 18 21
Sheila 8 4 8
08/23/2019 19:00:22
Name Cans Bucks Puns
Clyde 18 21 46
Sheila 37 2 11
Elmo 41 3 10
Elmo 10 4 2
输出:
name=Sheila cans=40 bucks=20 puns=50 ts=1566468058
name=Elmo cans=44 bucks=18 puns=21 ts=1566468058
name=Clyde cans=12 bucks=2 puns=79 ts=1566468058
name=Sheila cans=37 bucks=2 puns=11 ts=1566579622
name=Elmo cans=51 bucks=7 puns=12 ts=1566579622
name=Clyde cans=18 bucks=21 puns=46 ts=1566579622