Ограничение в 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
, которая занимает доли секунды и выполняется онлайн )..
Увеличение счетчика после печати текущей строки.
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
Это кажется излишне сложным подходом. По крайней мере, для примера, который вы показываете, который хорошо отсортирован, достаточно сделать:
$ 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
$ 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
в конце ).
Это предполагает, что файл отсортирован таким образом, что каждая строка с одним столбцом предшествует всем строкам, по которым должна быть вычислена отдельная кумулятивная сумма. Так представлены данные в вопросе.