Допустим, у меня есть эта строка:
foo|bar|foobar
Я хочу разделить ее на |
и , а затем использовать эти 3 новые строки в качестве входных данных для дальнейших процедур (давайте скажем заменить bar
на xxx
).
Конечно, я могу передать два экземпляра awk, например:
echo "foo|bar|foobar" | awk '{gsub(/\|/, "\n"); print}' | awk '/bar/ {gsub(/bar/, "xxx"); print}'
Но как мне добиться этого в одном скрипте? Сначала выполнить одну операцию для некоторого ввода, а затем обработать результат как новый ввод для второй операции?
Я пробовал что-то вроде этого:
echo "foo|bar|foobar" | awk -v c=0 '{
{
gsub(/\|/, "\n");
sprintf("%s", $0);
}
{
if ($0 ~ /bar/) {
c+=1;
gsub(/bar/, "xxx");
print c;
print
}
}
}'
Что приводит к такому:
1
foo
xxx
fooxxx
И благодаря счетчику c
совершенно очевидно, что последующий if
не обрабатывает многострочный ввод, который он получает как несколько новых записей , а вместо этого просто как одна многострочная запись.
Таким образом, мой вопрос таков: как заставить awk обрабатывать эту новую многострочную запись, получающую столько же однострочных записей?
Требуемый вывод в этот пример должен выглядеть примерно так, если я прав:
1
xxx
2
fooxxx
Но это всего лишь пример, вопрос скорее в механике такого перехода.