Faça um loop para um número diferente e comece a fazer um loop novamente (Awk/Bash)

Faça um loop para um número diferente e comece a fazer um loop novamente (Awk/Bash)

O loop em toda a soma da coluna usando pode ser feito no arquivo txt abaixo:

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

Agora eu gostaria de fazer algo diferente. Por exemplo, gostaria de somar as segundas colunas até quando os números da primeira coluna forem iguais e começar tudo de novo. Isso pode ser feito usando visto[$1]?

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

onde $1 sendo tratado como o valor do índice.

Não consegui fazê-lo funcionar usando seen[$1]. Ou alguma outra maneira legal de fazer o loop?

O resultado seria assim:

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

e assim por diante... até a coluna inteira.

Responder1

$ 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

Responder2

Se quiser usar apenas um arquivo de entrada usando o 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

informação relacionada