첫 번째 열을 기준으로 행을 그룹화한 다음 모든 두 번째 행 값의 합계와 모든 세 번째 행 값의 합계를 계산해야 합니다.
두 번째 열은 10:56 = 10*60 + 56 = 656초로 계산되어야 합니다.
입력 파일:
testing 00:34 123487
archive 00:45 3973
testing 09:16 800500
archive 10:10 100000
산출:
archive 655 103973
testing 590 923987
답변1
골프를 칠 때는 샷을 한 번만 치십시오. GNU awk 3.1.7에서 잘 작동합니다. 다른 awk 구현은 $2*60
. substr($2,0,2)*60
(정수 값 9로 해석하기 위해 "09:16"과 같은 것을 확장하면 규칙이 약간 확장됩니다.)
awk '{a[$1]+=$2*60+substr($2,4);b[$1]+=$3}END{for(c in a){print c,a[c],b[c]}}'
출력은 다음과 같습니다.
archive 655 103973
testing 590 923987
또는 Perl 방법:
perl -e 'while(<>){/(\S+) +(\d+):(\d+) (\d+)/;$a{$1}+=$2*60+$3;$b{$1}+=$4;}for(keys %a){print "$_ $a{$_} $b{$_}\n"}'
답변2
다음 awk
스크립트를 사용하십시오 gawk
.
{
split($2,time,":");
seconds=time[1]*60;
seconds+=time[2];
types[$1]["time"]+=seconds;
types[$1]["othersum"]+=$3
}
END {
for (record in types)
print record, types[record]["time"], types[record]["othersum"]
}
gawk -f script.awk /path/to/input
문제를 해결하는 것 같습니다.
한 줄로 필요한 경우 다음을 수행할 수 있습니다.
gawk '{split($2,time,":");seconds=time[1]*60;seconds+=time[2];types[$1]["time"]+=seconds;types[$1]["othersum"]+=$3} END {for (record in types) print record, types[record]["time"], types[record]["othersum"] }' /path/to/input
답변3
단지 다양성을 위해
perl -pe 's/(\d+):(\d+)/60*$1+$2/e' file | datamash -Ws groupby 1 sum 2,3
archive 655 103973
testing 590 923987