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

ここでは、値を印刷するのではなく、値を保存/累積するために3つの配列を使用します。次のブロックが処理されると(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

おすすめ記事