Для этого, так или иначе, вам придется сделать два прохода по записям.Один из способов - прочитать сам файл дважды, как в первом методе, показанном ниже.
При первом проходе сумма столбца 3 просто накапливается в s1
.Второй проход печатает первые два столбца с нормализованным третьим.
Обратите внимание, что вам нужно дважды предоставить файл в командной строке, чтобы awk обработал его дважды!
$ awk 'NR == FNR {s1 += $3; next} {print $1, $2, $3/s1}' file file
0 2 0.109673
1 0 0.0691501
2 2 0.0269401
3 2 0.0649329
4 2 0.000265256
5 26 0.00449324
6 1 0.0126832
7 1 0.0950195
8 0 0.0668381
9 1 0.0775188
10 1 0.12931
11 1 0.0583592
12 0 0.037281
13 0 0.0675704
14 1 0.0963798
15 1 0.0369565
16 1 0.0466299
Другой способто, что ближе к тому, куда вы направлялись при попытке, состоит в том, чтобы прочитать файл только один раз, сохраняя всю информацию о строках в памяти, в то время как вы одновременно суммируете столбец 3.
Затем в блоке END
, которыйзапустить после того, как все записи прочитаны и сумма полностью накоплена, вы перебираете массив, чтобы распечатать результаты.
awk ' { s1 += $3; a[NR] = $1 OFS $2; b[NR] = $3 }
END { for (i=1; i<=NR; ++i) print a[i], b[i] / s1 }' file
Этот второй метод имеет очевидные недостатки использования гораздо большего объема памяти - фактическис очень большим файлом этот подход может оказаться невозможным.
Если вы еще не знакомы с конструкцией NR == FNR
, см. Что такое "NR == FNR" в awk? ,Также см. Раздел «Обработка двух файлов» в https://backreference.org/2010/02/10/idiomatic-awk/.