最初の列に基づいて行をグループ化し、すべての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*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
問題を解決しているようです。
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