다음 입력을 사용하세요.
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