3行目ごとに行を追加

3行目ごとに行を追加

このような文書があります。

1 0.2
1 0.3
1 0.1
2 0.8
2 0.5
2 0.3

最初の列が同じ場合は、行を追加して次のように出力したいと思います。

1 0.6
2 1.6

awkを使ってこれを行うにはどうすればよいですか?それとも、他のツールを使用する方が簡単ですか?

PD:3行ごとに最初の列は常に同じなので、配列を作成し、行数が3になるまで$ 2を追加して印刷しますか?しかし、いくつかawk 'BEGIN {x=0,n=1} {n++,x=x+$3}'の条件がありますか?

答え1

「最初の値、2番目の値の合計」配列を作成し、ファイル全体を読み取った後に結果を印刷できます。

awk '{a[$1]+=$2} END { for (v in a) { print v,a[v]}}' datafile

出力をソートする最も簡単な方法は、ソートを介して出力をパイプすることです。

awk '{a[$1]+=$2} END { for (v in a) { print v,a[v]}}' datafile | sort -n

答え2

私はこれを行いますperl

#!/usr/bin/env perl

use strict;
use warnings 'all'; 

my %sum_of;
while ( <DATA> ) {
   my ( $key, $value ) = m/(\d+) ([\d\.]+)/; 
   $sum_of{$key} += $value;
}

print "$_ $sum_of{$_}\n" for sort keys %sum_of;


__DATA__
1 0.2
1 0.3
1 0.1
2 0.8
2 0.5
2 0.3

これにより、希望の出力が提供されます。

一行で:

perl -lne '($key, $value) = split; $sum_of{$key}+=$value; END {print "$_ $sum_of{$_}" for sort keys %sum_of}'

関連情報