Как использовать "qstat" и "grep" для отображения строк, содержащих диапазон чисел?

Учитывая входной файл:

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" )).

0
26.03.2021, 15:03
2 ответа

Хотя вы можете создавать регулярные выражения для соответствия диапазону чисел, это действительно не стоит того. Лучше используйте какой-нибудь инструмент, который может работать с числами как с числами. Например. в 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 это невозможно, так как нет чередования.)

2
28.04.2021, 22:56

Я нашел простое решение:

qstat | fgrep "$(seq 146868 146927)"

0
28.04.2021, 22:56

Теги

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