Как регулярно использовать сегодняшнюю или предыдущую дату, используя awk и $date?

avatar
AlphaK12
9 августа 2021 в 04:31
86
2
-2

Столбец 13 моих данных содержит дату в формате ГГММДД. Я пытаюсь использовать регулярное выражение, используя $date на сегодняшний день и предыдущие дни. Ни один из следующих кодов не будет работать. Может ли кто-нибудь дать мне некоторые идеи?

СЕГОДНЯ

awk -F, ($13~/$(date '+%Y%m%d')/) {n++} END {print n+0}' file.csv)

3 ДНЯ НАЗАД

awk -F, ($13~/$(date -d "$date -3 days" '+%Y%m%d')/) {n++} END {print n+0}' file.csv
Источник
RavinderSingh13
9 августа 2021 в 04:42
0

Добро пожаловать в SO, спасибо, что показали свои усилия. Не могли бы вы добавить образцы входных данных и ожидаемых результатов в свой вопрос, чтобы сделать его более понятным.

jhnc
9 августа 2021 в 05:01
0

как я прокомментировал вам ваш предыдущий вопрос, подумайте: coderhelper.com/q/6697753/10971581

MichaelR
9 августа 2021 в 05:13
0

Какую команду даты вы используете? В OSX -d устанавливает часовой пояс, а -v используется для определения разницы во времени. Итак, date '+%Y%m%d' — это сейчас, а date -v-72H '+%Y%m%d' — на 3 дня (72 часа) раньше.

Renaud Pacalet
9 августа 2021 в 06:46
0

Здравствуйте, добро пожаловать на SO. Показанные вами команды даже синтаксически неверны. Вы их пробовали?

Ответы (2)

avatar
tripleee
9 августа 2021 в 07:47
0

Ваши попытки Awk имеют довольно серьезные проблемы с цитированием. Как правило, вы захотите заключить свой скрипт Awk в одинарные кавычки и передать любые параметры как переменные с помощью -v.

.
awk -F, -v when="$(date -d "-3 days" '+%Y%m%d')" '$13~when {n++} END {print n+0}' file.csv

Возможно, обратите внимание, что $date нигде не определен. Обозначение $(cmd ...) представляет собой замену команды, которая запускает cmd ... и заменяет выражение своим выводом.

Возможно, также обратите внимание, что date -d является расширением GNU и не является переносимым, хотя оно будет работать на Linux и других платформах, на которых установлены утилиты GNU.

Более того, в зависимости от того, что находится в $13, вы можете захотеть реализовать простой анализ даты для этого формата, чтобы вы могли указать диапазон допустимых значений, а не искать совпадения в статическом тексте.

Эта цитата верна для оболочек Unix в стиле Bourne. Если вы работаете в Windows, правила цитирования совсем другие, и, скорее всего, их часто невозможно применить полезным образом.

avatar
Daweo
9 августа 2021 в 07:41
0

Если вы используете GNU AWK, вы можете использовать его функции времени, чтобы проверить, работает ли он do

awk 'END{print strftime("%y%m%d")}' emptyfile.txt

, который должен выводить текущий день в формате YYMMDD. Если это так, вы можете получить то, что хотите, следующим образом:

awk 'BEGIN{today=strftime("%y%m%d");threedago=strftime("%y%m%d",systime()-259200)}END{print today, threedago}' emptyfile.txt

выход (на сегодняшний день)

210809 210806

Объяснение: strftime первый аргумент — формат времени %y — год 00...99, %m — месяц 01...12, %d — день 01...31. Второй аргумент является необязательным, и это секунды с начала эпохи. Если используется пропущенное текущее время, systime() возвращает количество секунд с начала эпохи, 259200 равно 72 часам в секундах.

Пример использования в качестве регулярного выражения, допустим, что у меня есть file.txt следующим образом

210807 120
210808 150
210809 100

и хочу получить содержимое второго столбца на сегодня, тогда я могу сделать

awk 'BEGIN{today=strftime("%y%m%d")}$1~today{print $2}' file.txt

получение вывода (на сегодняшний день)

100

(проверено в gawk 4.2.1)