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

관련 정보