Вы можете сделать это с помощью примера скрипта (мой не оптимален, но будет работать)
awk -F'[]|]' '{
print $1,$2,$3,$4,$7,$10
print $1,$2,$3,$5,$8,$10
print $1,$2,$3,$6,$9,$10 }' input_filename
Или
awk -F'[]|]' '{
for (i = 4; i <= 6; i++)
print $1,$2,$3,$i,$(i+3),$10}' input_filename
Вы можете изменить разделитель полей вывода(пробел по умолчанию ), добавив -v OFS=','
.
И благодаря @steeldriver еще один гибкий способ (с внутренним разделением полей )для выполнения задания:
awk -F'|' '{
split($3,a,/]/); n = split($4,b,/]/);
for(i=1;i<=n;i++) print $1,$2,a[1],a[i+1],b[i],$5}' input_filename
В соответствии с отредактированным вопросом, если вы хотите заменить пустое поле0
(нулем ), вы можете сделать это с помощью скрипта, например:
awk -F'[]|]' '{
for (i = 1; i <= 11; i++) if ($i == "") $i=0}
{
print $1,$2,$3,$4,$7,$10,$11
print $1,$2,$3,$5,$8,$10,$11
print $1,$2,$3,$6,$9,$10,$11 }' input_filename
Судя по вашему комментарию, скрипт должен выглядеть так:
awk -F'|' -v OFS="\t" '{
n = split($4,D,"]"); split($5,E,"]");
for (i = 1; i <= n; i++) {
if (D[i] == "") D[i]=0;
if (E[i] == "") E[i]=0;}
print $1,$2,$3,D[i],E[i],$6,$7 }' input_file