Переходим к другому числу и начинаем цикл снова (Awk/Bash)

Переходим к другому числу и начинаем цикл снова (Awk/Bash)

Цикл по всей сумме столбца можно выполнить с помощью следующего текстового файла:

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

Теперь я хотел бы сделать что-то другое. Например, я хотел бы суммировать вторые столбцы до тех пор, пока числа в первых столбцах не станут одинаковыми, и начать снова. Можно ли это сделать с помощью 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:

 $ 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

Связанный контент