Использование AWK для разделения подстроки по последним n символам в новый столбец

Во-первых, вам необходимо сделать резервную копию ваших данных, для загрузки Windows вы можете использовать Super Grub2 Disk , который позволит вам загружать другую ОС, устаревшую или UEFI.

Поскольку GRUB не понимает таблицы разделов GPT, вам нужно создать раздел bios_grub , а затем переустановить Grub, также необходимо установить os-prober для обнаружения других ОС .

Примечание : Для загрузки GRUB с диска с разделами GPT в системе на основе BIOS требуется загрузочный раздел BIOS. Обратите внимание, что этот раздел не связан с точкой монтирования / boot и будет использоваться GRUB напрямую. Не создавайте на нем файловую систему и не монтируйте ее.

Что такое раздел bios_grub ?

Загрузочный раздел BIOS - это раздел на устройстве хранения данных, который GNU GRUB использует на устаревших персональных компьютерах на основе BIOS для загрузки операционной системы, когда фактическое загрузочное устройство содержит таблицу разделов GUID (GPT). Такой макет иногда называют загрузкой BIOS / GPT.

Почему?

Загрузочный раздел BIOS необходим, потому что GPT использует сектора диска, следующие сразу за основной загрузочной записью (MBR), для хранения фактической таблицы разделов, тогда как традиционная схема разделения на основе MBR не назначает их ни для каких специального назначения.В результате на GPT-дисках не хватает неиспользуемого места для хранения вторых ступеней загрузчиков; загрузчики обычно реализуются таким образом, что их код, хранящийся в MBR, которая не может содержать более 512 байт, работает как первая ступень, которая служит в первую очередь для загрузки более сложной второй ступени, которая, например, может считывать и загружать операционные ядро системы из файловой системы.

2
07.05.2017, 23:24
5 ответов

С POSIX-совместимым awk:

awk -F, -v OFS=, '{sub(/.{6}$/, OFS "&", $2); print}'

С POSIX-совместимым sed:

sed 's/^\([^,]*,[^,]*\)\([^,]\{6\}\)/\1,\2/'

Они изменяют строки, только если второе поле имеет длину не менее 6 символов. (обратите внимание, что он с радостью изменит 111,123456,333 на 111,,123456,333, оставив второе поле пустым).

5
27.01.2020, 21:49

Подход KISS с awk:

$ awk -F, '{l=length($2); if (l>6) {$2=substr($2,1,l-6) OFS substr($2,l-5)}} 1' OFS=, file
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0
3
27.01.2020, 21:49
perl -pe 's/(,.*?,)/$1 =~ s!......,!,$&!r /e'  x.csv
  • заменить второе поле (,.*?,) на ...
  • результат подстановки ( =~ s! ...! ...!r) из последних 6 цифр (...... ) на них и и ,
1
27.01.2020, 21:49

С реализацией sed с поддержкой расширенных регулярных выражений предполагается не менее 6 символов во 2-м столбце для всех строк

$ sed -E 's/,([^,]*)([^,]{6}),/,\1,\2,/' ip.csv 
3102017,90,131112,0,740
3022017,8,903944,90,0
3092017,127,037191,475,0
  • -E для расширенных регулярных выражений , в некоторых реализациях требуется -r вместо
  • ,([^,]*)([^,]{6}), будет соответствовать , 2-й столбец и ,
    • 2-й столбец захвачен двумя группами с последними 6 символами во 2-й группе
  • ,\1,\2, заменить по желанию
2
27.01.2020, 21:49

С perl, так как sed и awk уже заняты:

perl -F, -lpe 'splice @F, 1, 1, ($F[1] =~ m/^(\d+)(\d{6})$/g); $_ = join ",", @F' file

С vim, просто для удовольствия:

:%s/\m,\d*\zs\ze\d\{6},/,/
2
27.01.2020, 21:49

Теги

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