获取 awk 中带有时间戳的条目总和

获取 awk 中带有时间戳的条目总和

使用此输入:

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

我熟悉这里描述的方法:https://stackoverflow.com/questions/2311228/how-can-i-sum-values-in-column-based-on-the-value-in-another-column

我只是不知道如何使用时间戳作为输出的条件。

答案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

相关内容