Schleife bis zu einer anderen Zahl und beginne erneut mit der Schleife (Awk/Bash)

Schleife bis zu einer anderen Zahl und beginne erneut mit der Schleife (Awk/Bash)

Eine Schleife über die gesamte Spaltensumme kann wie folgt in der folgenden TXT-Datei durchgeführt werden:

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

Jetzt möchte ich etwas anderes machen. Ich möchte zum Beispiel die zweiten Spalten bis zu dem Punkt summieren, an dem die Zahlen der ersten Spalte gleich sind, und dann wieder von vorne beginnen. Ist das mit seen[$1] möglich?

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

wobei 1 $ als Indexwert behandelt wird.

Ich konnte es nicht zum Laufen bringen, indem ich seen[$1]. Oder gibt es eine andere gute Möglichkeit, die Schleife zu erstellen?

Das Ergebnis sähe so aus:

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

und so weiter... bis zur gesamten Spalte.

Antwort1

$ 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

Antwort2

Wenn Sie nur eine Eingabedatei mit awk verwenden möchten:

 $ 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

verwandte Informationen