첫 번째 열을 기준으로 모든 행을 그룹화한 다음 두 번째와 세 번째 열의 합을 계산합니다.

첫 번째 열을 기준으로 모든 행을 그룹화한 다음 두 번째와 세 번째 열의 합을 계산합니다.

첫 번째 열을 기준으로 행을 그룹화한 다음 모든 두 번째 행 값의 합계와 모든 세 번째 행 값의 합계를 계산해야 합니다.

두 번째 열은 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

관련 정보