Преобразование строки переменной длины в несколько строк с конкретными выбранными полями, сохраняя первый и последний столбец с разделителями в каждой строке

У меня есть выход из конфигурации брандмауэра, который содержит строки с данными в определенном формате. Мне нужно преобразовать эти данные для электронной таблицы, чтобы разбить группы из 4 столбцов из каждой строки в новую, сохранив при этом первое и последнее разделенные поля строки, из которой они были получены, а затем удалив первую строку.

Я пытался использовать awk, ed, rs, trи не могу понять, как правильно это сделать. Каждая строка имеет разную длину, но поля всегда будут группой из 4, начиная со второго поля с разделителями. Итак, поля 2,3,4,5; 6,7,8,9; 10,11,12,13; 14,15,16,17, и т.д... длина строк может быть до 128 полей

Данные, которые я пытаюсь преобразовать, выглядят следующим образом

startoflinesampletext_25;10.2.8.13;25;10.2.8.13%2;25;10.2.8.14;25;10.2.8.14%2;25;10.2.8.15;25;10.2.8.15%2;25;10.2.8.56;25;10.2.8.56%2;25;10.2.8.57;25;10.2.8.57%2;25;endoflinesampletext

Ожидаемый результат, на который я надеюсь, будет выглядеть так:

startoflinesampletext_25;10.2.8.13;25;10.2.8.13%2;25;endoflinesampletext
startoflinesampletext_25;10.2.8.14;25;10.2.8.14%2;25;endoflinesampletext
startoflinesampletext_25;10.2.8.15;25;10.2.8.15%2;25;endoflinesampletext
startoflinesampletext_25;10.2.8.56;25;10.2.8.56%2;25;endoflinesampletext
startoflinesampletext_25;10.2.8.57;25;10.2.8.57%2;25;endoflinesampletext

2 ответа

awk в помощь!

$ awk -F';' 'BEGIN{OFS=FS} {for(i=2;i<NF;i+=4) print $1,$i,$(i+1),$(i+2),$(i+3),$NF}' file

startoflinesampletext_25;10.2.8.13;25;10.2.8.13%2;25;endoflinesampletext
startoflinesampletext_25;10.2.8.14;25;10.2.8.14%2;25;endoflinesampletext
startoflinesampletext_25;10.2.8.15;25;10.2.8.15%2;25;endoflinesampletext
startoflinesampletext_25;10.2.8.56;25;10.2.8.56%2;25;endoflinesampletext
startoflinesampletext_25;10.2.8.57;25;10.2.8.57%2;25;endoflinesampletext

обратите внимание, что нет подтверждения, что поля кратны четырем.

Это может работать для вас (GNU sed):

sed -E 's/^(([^;]*)(;[^;]*){4})(.*(;.*))$/\1\5\n\2\4/;P;D' file

Заменить четвертый ; последним полем, за которым следует новая строка, за которым следует первое поле, выведите / удалите первую строку и повторите. Итерация сокращает строку до тех пор, пока сопоставление с образцом перестанет работать и по умолчанию будет напечатана последняя запись.

Другие вопросы по тегам