GNUawkрешение:
awk -F'[,=]' '{ gsub(/[({}) ]/,"",$0); for(i=2;i<NF;i+=2) a[$i]=$(i+1);
asorti(a,b); for(k in a) print $1,k,a[k] }' file
-F'[,=]'
-разделитель полей
gsub(/[({}) ]/,"",$0)
-удаление ненужных символов
for(i=2;i<NF;i+=2) a[$i]=$(i+1)
-сбор пар значений в массивa
asorti(a,b)
-сортировать массив a
по ключам
Выход:
0 33 9000.0
0 34 9000.0
0 35 9000.0
0 36 9000.0
В дополнение к ответу Фредди вы можете использовать команду :global
. Например:
:g/maaa/norm A;
Что означает:
:g/ " On each line matching this regex:
maaa " 'maaa'
norm A; " Run 'A;' as if I had manually typed
Вам придется настроить «maaa» на то, что вам нужно, так как из вашего вопроса не ясно, к каким строкам вы хотите применить это. :g/hdfs/norm A;
например, добавит точку с запятой к любой строке, содержащей текст «hdfs».
Чтобы добавить ;
ко всем строкам, заканчивающимся на maaa'
, вы можете использовать следующую замену. Нажмите Esc , затем введите
:%s/maaa'$/&;/
Пояснение:
:%s/
заменить по одному в каждой строке maaa'$
соответствует maaa'
в конце строки$
/&;/
заменить совпадающим шаблоном и;
;
ко всем строкам, начинающимся с пробела и 'hdfs://
и заканчивающимся '
,вы можете использовать следующую замену. Снова нажмите Esc , затем введите :%s/^ 'hdfs:\/\/.*'$/&;/
Пояснение:
:%s/
заменить по одному в каждой строке ^ 'hdfs:\/\/.*'$
соответствует началу строки ^
, за которым следует пробел, за которым следуетhdfs://
(/
необходимо экранировать с помощью \
), за которым следует любой символ .*
, за которым следует '
и конец линии$
/&;/
заменить совпадающим шаблоном и;
Вы всегда можете отменить операцию, нажав Esc + u , если что-то пошло не так.