awk: вывод нескольких строк из одной строки с простой заменой - PullRequest
1 голос
/ 06 сентября 2010

000 000 000 000 (4 поля, каждое из которых представляет собой группу из 3 нулей, разделенных пробелом)

Процесс создания 4 новых строк

100 000 000 000

000 100 000 000

000 000 100 000

000 000 000 100

В каждой строке группа из трех нулей заменяется на 100

Как я могу это сделать?

1017 * Том *

1 Ответ

1 голос
/ 06 сентября 2010
$ echo '000 000 000 000' | awk '{for (i=1;i<=NF;i++) {f=$i; $i="100"; print; $i=f}}'
100 000 000 000
000 100 000 000
000 000 100 000
000 000 000 100

Редактировать:

Поля перебираются с использованием цикла for.Каждое поле ($i - для номера поля i) сохраняется во временную переменную f.Затем содержимое поля заменяется.Запись ($0) печатается.Поле возвращается к своему предыдущему значению, используя временное значение.

Может быть проще следить, если использовались эти данные: 001 002 003 004.Тогда результат будет выглядеть так:

100 002 003 004
001 100 003 004
001 002 100 004
001 002 003 100

Вот версия сценария оболочки, использующая sed:

data='001 002 003 004'    # or 000 000 000 000
for i in {1..4}; do echo "$data" | sed "s/\<[0-9]\{3\}\>/100/$i"; done

или

count=$(echo "data" | $wc -w)
for ((i=1;i<=count;i++)); do echo "$data" | sed "s/\<[0-9]\{3\}\>/100/$i"; done

или Bash без каких-либо внешнихутилиты:

data=(001 002 003 004)    # use an array
count=${#data[@]}
for ((i=0;i<count;i++)); do f=${data[i]}; data[i]=100; echo "${data[@]}"; data[i]=$f; done

или много других возможностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...