Накопленная сумма значений в столбце с одинаковым идентификатором

Ограничение в 2 ТБ, которое вы видите, связано с (древним форматом таблицы разделов DOS MBR примерно 1983 года ). Вы ограничены 2³² секторами, из которых 512 -байтовых секторов берут 2TiB. fdiskчасто поддерживает только DOS MBR.

Решением этой проблемы является использование более нового формата таблицы разделов, GPT. gdisk— это один из нескольких инструментов, обрабатывающих таблицы GPT, и он попытается преобразовать их при запуске. Преобразование выполняется в памяти только до тех пор, пока вы не нажмете w. Это часто приводило бы к сбою, если бы вы не просто расширили диск, а сделали так, чтобы он работал. (GPT требует наличия нескольких секторов как в конце, так и в начале диска; DOS MBR не нужен конец ).

Когда вы запустите gdisk, вы должны увидеть что-то вроде этого:

***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************

, и вы можете использовать обычные команды, с которыми вы должны быть знакомы из fdisk, для управления таблицей разделов GPT.

Очевидно, у вас должны быть резервные копии, как минимум ваша серверная команда должна сделать снимок вашей виртуальной машины.

В долгосрочной -перспективе вам следует рассмотреть возможность использования -устройств, не разделенных на разделы, где это возможно, возможно, через LVM. Затем расширить их намного проще, и, как правило, это онлайн-операция (, например, если вы передадите неразмеченное устройство в LVM, это будет простая pvresize /dev/whatever, которая занимает доли секунды и выполняется онлайн )..

4
21.01.2021, 21:11
3 ответа

Увеличение счетчика после печати текущей строки.

awk '{print $1, $2, sum[$1]; sum[$1] += $2}' file
1
1 2 0
1 2 2
1 4 4
1 6 8
2
2 1 0
2 2 1
2 3 3
2 4 6
3
3 1 0
3 5 1
3 9 6
3 11 15

Это использует преимущества того, что awk обрабатывает неопределенные переменные как пустую строку или (в числовом контексте )как ноль.

Если вы не хотите печатать инкрементную сумму 0, используйте

if ($2 != "") sum[$1] += $2
6
18.03.2021, 22:35

Это кажется излишне сложным подходом. По крайней мере, для примера, который вы показываете, который хорошо отсортирован, достаточно сделать:

$ awk '{ if($1 in a){print $0,a[$1]}else{print} if($2){a[$1]+=$2;}}' file 
1     
1 2 
1 2   2
1 4   4
1 6   8
2     
2 1 
2 2   1
2 3  3
2 4   6
3     
3 1 
3 5    1
3 9   6
3 11 15

Если вы хотите добавить 0во второй раз, когда вы видите идентификатор (, ваш желаемый результат не ясен, поскольку вы сделали это для идентификаторов 2 и 3, но не для идентификатора 1 ). ], вы можете сделать:

$ awk '{ if($1 in a){print $0,a[$1]}else{a[$1]=0; print} if($2){a[$1]+=$2;}}' file
1     
1 2  0
1 2   2
1 4   4
1 6   8
2     
2 1  0
2 2   1
2 3  3
2 4   6
3     
3 1  0
3 5    1
3 9   6
3 11 15
2
18.03.2021, 22:35
$ awk 'NF == 1 { sum = 0 } NF > 1 { $(NF+1) = sum; sum += $2 }; 1' file
1
1 2 0
1 2 2
1 4 4
1 6 8
2
2 1 0
2 2 1
2 3 3
2 4 6
3
3 1 0
3 5 1
3 9 6
3 11 15

Это сбрасывает кумулятивную сумму всякий раз, когда имеется только один столбец. При наличии нескольких столбцов текущая сумма добавляется в качестве дополнительного столбца в конце перед обновлением суммы. Текущая запись, с добавлением или без добавления дополнительного столбца, затем безоговорочно выводится (это то, что делает одинокий 1в конце ).

Это предполагает, что файл отсортирован таким образом, что каждая строка с одним столбцом предшествует всем строкам, по которым должна быть вычислена отдельная кумулятивная сумма. Так представлены данные в вопросе.

2
18.03.2021, 22:35

Теги

Похожие вопросы