最初の列に基づいてすべての行をグループ化し、2番目と3番目の列の合計を計算します。

最初の列に基づいてすべての行をグループ化し、2番目と3番目の列の合計を計算します。

最初の列に基づいて行をグループ化し、すべての2番目の行値の合計とすべての3番目の行値の合計を計算する必要があります。

2番目の列は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*60substr($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問題を解決しているようです。

1行で必要な場合は、次のことができます。

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

関連情報