Использование цикла для такого рода работ не рекомендуется, если только вы не имеете дело с небольшим «нет». строк 1 . Вам лучше использовать диапазоны и пространство удержания:
sed '/Address/,/###/{
/###/!H;/Address/h;/###/!d;x;s/\n//;s/\n/|/g;G
}' infile
То есть для каждой строки в этом диапазоне выполните следующие действия: :если это не последняя строка в диапазоне, добавьте пробел для хранения (перезапишите, если это первая строка в диапазоне )и удалите строку, иначе буферы обмена, удалите первую встроенную новую строку и замените оставшиеся на |
. Затем добавьте содержимое буфера хранения в пространство шаблонов.
Это не удастся, если за последним Address
не следует ###
, поэтому, чтобы избежать этого, используйте второе условие и удалите, только если это не последняя строка ввода, в противном случае добавьте для удержания буфера, обмена и выхода:
sed '/Address/,/###/{
/###/!H;/Address/h;/###/!{
$!d;H;x;q
}
x;s/\n//;s/\n/|/g;G
}' infile
1 :чем больше строк вам нужно вытащить, тем медленнее это происходит из-за необходимости постоянно проверять пространство шаблонов на соответствие -см. результаты здесь(это другое требование, я знаю, но просто чтобы дать вам представление...)
Похоже, вы просите:
awk '{
y = $2;
for(z=1;z<=3;z++){
value = z < $3 ? 0 : z > $4 ? 2 : 1;
$2 = y OFS z OFS value;
print
}
}' file
однако я не могу заставить его производить показанный вывод.