Вы также можете попробовать с gnu sed
sed -E 's/([0-9]*) \| (.*)/[ \1 -gt 20 ] \&\& echo do something with \2/e' infile
С СЭД:
sed 'y/34/01/;n' file
Что означает:
Однако это не удалось бы, если бы данные содержали, например, 14, преобразуя их в 11. Чтобы обойти это, выберите
sed 's/\<4\>/1/g;s/\<3\>/0/g;n' file
Проблема с вашим подходом заключается в том, что у вас есть только один оператор 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
сокращенное обозначение для «вывести строку, полученную в результате всех выполненных преобразований».