Заменить значения на awk для цикла в определенных строках

Вы также можете попробовать с gnu sed

sed -E 's/([0-9]*) \| (.*)/[ \1 -gt 20 ] \&\& echo do something with \2/e' infile
2
11.05.2020, 14:44
2 ответа

С СЭД:

sed 'y/34/01/;n' file

Что означает:

  • Замените 3 и 4 на 0 и 1 в этой строке и выведите ее;
  • Получить следующую строку и распечатать ее;
  • Получить следующую строку и повторить цикл.

Однако это не удалось бы, если бы данные содержали, например, 14, преобразуя их в 11. Чтобы обойти это, выберите

sed 's/\<4\>/1/g;s/\<3\>/0/g;n' file

Эти \<и \>соответствуют началу и концу слова.

5
28.04.2021, 23:15

Проблема с вашим подходом заключается в том, что у вас есть только один оператор printв блоке END. Значение $0в этом блоке — это содержимое последней строки вашего файла. Таким образом, ваш код awkбудет печатать только последнюю строку файла.

Также обратите внимание, что awkприменяет операции к каждой строке , если у вас нет условия перед {... }блоками (, например END, которое применяется только к концу -строки. -файл ). Таким образом, ваш код попытается проверить 1-е, 3-е и т. д. поле из в каждой строке , и если это 3или 4, замените это на 0или 1соответственно... но никогда не печатайте результат.

Чтобы применить правило к каждой нечетной строке, вы можете проверить, является ли NR%2единицей (или просто не -нулем):

awk 'NR%2{for (i=1;i<=NF;i++) if ($i==3 || $i==4) $i-=3}1' b.temp

Когда 1встречается вне правила, это awkсокращенное обозначение для «вывести строку, полученную в результате всех выполненных преобразований».

5
28.04.2021, 23:15

Теги

Похожие вопросы