Да, вот подход:
awk '$1 == "ALTER" { $5=$5+5 } 1'
С файлом примера etuardu получается
ALTER xx yy zz 15 10
NOALT aa bb cc 20 20
ALTER 11 22 33 35 30
Вот как это работает. Есть два случая, выраженные в шаблонах и действиях awk. В первом шаблон является тестом первого поля, чтобы определить, равно ли оно "ALTER"
, и вызывает действие, которое изменяет пятое поле, если шаблон оценивается как true. Второй паттерн - это последний 1
; это всегда так, поэтому неявное действие print
выполняется.
Одна из особенностей этого решения: разделители полей, считываемые на входе, не обязательно должны быть разделителями на выходе. В приведенной выше простой форме разделители полей от входных данных считаются пробелами, а одиночные пробелы записываются в выходные данные; установите FS
и OFS
на определенные значения, если это не то, что вы хотите. Однако только строки, в которых поле было изменено, будут иметь новые разделители полей, поэтому нулевая операция, такая как '$ 1 = $ 1', приведет к перестроению всех записей (это удобный способ изменить разделители полей, используя только $1=$1
).