異なる番号までループし、再びループを開始する (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番目の列を合計し、もう一度やり直したいです。seen[$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 を使用して 1 つの入力ファイルのみを使用する場合:

 $ 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

関連情報