別の番号で繰り返し、もう一度繰り返し開始(Awk / Bash)

別の番号で繰り返し、もう一度繰り返し開始(Awk / Bash)

ループを使用して、以下のtxtファイルの合計列の合計を繰り返すことができます。

101     10
101     10
101     10.10
101     13
101     10
101     10
102     10.140
102     10
102     10
102     0.90
102     10
103     10
104     10
111     11
111     11
111     5.485e+12
111     11


 awk '{sum+=$2;} END{print sum;}' file1.txt > sum_a.txt

今私は別のことをしたいと思います。たとえば、2番目の列の合計を計算し、最初の列の数字が同じ場合は再起動したいとします。 saw[$1] を使ってこれを行うことはできますか?

awk '{ seen[$1] += $2 } END { for (i in seen) print i, seen[i] }' file1.txt

ここで $1 はインデックス値とみなされます。

私はそれを実行するために使用することはできませんseen[$1]。それともループを実行する他の良い方法はありますか?

結果は次のとおりです。

101     63.10
101     63.10
101     63.10
101     63.10
101     63.10
101     63.10
102     40. 90

等…全列まで。

答え1

$ awk 'NR==FNR{sum[$1]+=$2; next} {print $1, sum[$1]}' file file
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
102 41.04
102 41.04
102 41.04
102 41.04
102 41.04
103 10
104 10
111 5485000000033
111 5485000000033
111 5485000000033
111 5485000000033

答え2

単一の入力ファイルにのみawkを使用したい場合:

 $ awk -v c=1 '{ a[$1]+=$2;b[c]=$1;c+=1} END { for( i=1;i<=NR;i++ ){key=b[i]; print key" "a[key]} }' file1.txt  
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
102 41.04
102 41.04
102 41.04
102 41.04
102 41.04
103 10
104 10
111 5485000000033
111 5485000000033
111 5485000000033
111 5485000000033

関連情報