печатать строки между 1-м вхождением 1-го шаблона и последним вхождением 2-го шаблона с помощью AWK

atхранит свои задания в виде сценариев оболочки, которые настраивают переменные окружения задания (и рабочий каталог ). Вы можете увидеть их, запустив

at -c ${jobid}

замена ${jobid}при необходимости (см.atq). Вы найдете значение TEST_DIRв выводе.

1
15.11.2021, 09:07
2 ответа

Если мы проигнорируем строку ...и предположим, что все ваши даты расположены в порядке возрастания $2, как показано в вашем примере, тогда все, что вам нужно, это:

$ awk -F';' '(20210112 <= $2) && ($2 <= 20210219)' file
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
-;20210219;-;-;-;

или более эффективно, так как он выходит за пределы диапазона:

$ awk -F';' '20210112 <= $2{f=1} $2 > 20210219{exit} f' file
-;20210112;-;-;-;
-;20210112;-;-;-;
-;20210112;-;-;-;
...
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210217;-;-;-;
-;20210219;-;-;-;
-;20210219;-;-;-;

Вышеупомянутое также предполагает, что если дата окончания отсутствует во входных данных, вы хотите печатать с даты начала до конца файла, а если дата начала отсутствует, вы хотите печатать с первой даты, превышающей от даты начала до даты окончания и т. д.

4
15.11.2021, 12:02

Предполагая, что у вас есть строковый порядок даты, т. е. между двумя 20210219строками не может быть «беспорядочного» 20210220, следующее будет работать:

awk -F';' -v start="20210112" -v stop="20210219" '$2==start{p=1} $2==stop{p=0} p||$2==stop' input.dat

Даты начала и окончания будут переданы в программу как awkпеременные startи stop. Как только мы находим дату начала, мы устанавливаем флагp(для «печати» )на 1. Если мы находим дату остановки, мы сбрасываем ее на 0. Строки будут печататься до тех пор, пока либо pравно 1, либо текущая дата строки равна дате окончания. Таким образом, мы будем печатать до последнего вхождения 20210219.

Обратите внимание, что это будет работать только в том случае, если в файле явно указаны даты начала и окончания. Если нет, вы можете использовать тот факт, что ваши даты в порядке ISO:

awk -F';' -v start="20210112" -v stop="20210219" '$2>=start&&$2<=stop' input.dat

Это будет печататься до тех пор, пока второе поле равно или больше даты начала и равно или меньше даты окончания. Это будет работать с датами, отформатированными так, как вы показали, но не в случае содержимого $2, которое нельзя легко упорядочить с помощью операторов сравнения <или >.

2
15.11.2021, 09:25

Теги

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