Учитывая входной файл:
HEADER 123456
SHIPTO CODE 123 LANE HOUSTON TX
ITEM ACME BRICK
И желание изменить поле после 'CODE', где первое поле 'SHIPTO':
$ awk 'BEGIN { OFS = "\t" } $1 != "SHIPTO" { print } $1 == "SHIPTO" { $3="0000"; print }' input
HEADER 123456
SHIPTO CODE 0000 LANE HOUSTON TX
ITEM ACME BRICK
Если ваши поля имеют фиксированную -длину и пробел -и не разделены табуляцией, вы можете использовать форматированные строки печати (e. грамм.printf( "%20s\t" "$1" )
).
Хотя вы можете создавать регулярные выражения для соответствия диапазону чисел, это действительно не стоит того. Лучше используйте какой-нибудь инструмент, который может работать с числами как с числами. Например. в awk это довольно тривиально. Здесь a
и b
— нижний и верхний пределы соответственно, а $1
— первое поле, по умолчанию разделенное пробелами.
$ qstat | awk -v a=146868 -v b=146927 '$1 >= a && $1 <= b {print}'
146911 2.19397 REMD xxxxxx Rq 03/26/2021 11:37:20 160
(В ERE эквивалентное регулярное выражение было бы чем-то вроде 146(86[89]|8[789][0-9]|9[01][0-9]|92[0-7])
, если только я не допустил там ошибку, что вполне вероятно. В BRE это невозможно, так как нет чередования.)