Передача процитированные строки аргументы AWK внутри Баш скрипт

голоса
0

У меня есть ряд файлов журналов , которые используют csvформат, и с первого поля на каждой линии , состоящей из временной метки в окружении двойных кавычек, как показано ниже:

2018-10-12 00:08:28,248351,1659.912,1.145031,6.180728
2018-10-13 02:14:16,248486,243.657,0.513548,9.661507
2018-10-13 22:31:52,248920,1014.364,0.357985,4.153846
2018-10-14 06:19:31,249035,629.172,1.668043,8.029534

Я использую bashскрипт для работы с этими файлами журналов, и в том числе awkдля выбора записей в пределах указанного диапазона на основании временной метки. Двойные кавычки не играет хорошо , так что я должен избежать их , как показано ниже , чтобы извлечь соответствующие строки:

awk '
    BEGIN { FS=,; ts=\2018-10-13 00:00:00\; st=\2018-10-14 00:00:00\ }
    $1>=ts && $1<st { print $0 }
' $file.in > $file.out

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

В моем bashсценарии, я пытался создать переменные tsи stс временной метки строк , представляющих собой начальные и конечные пределы, то ссылки на эти переменные в позднем вызове awk.

ts=\2018-10-13 00:00:00\
st=\2018-10-14 00:00:00\

Это не работает:

awk '
    BEGIN { FS=,; ts=${ts}; st=${st} }
    $1>=st && $1<st { print $0 }
' $file.in > $file.out

Ни делает это:

awk '
    BEGIN { FS=, }
    $1>=${ts} && $1<${st} { print $0 }
' $file.in > $file.out

Я подозреваю, что может быть две проблемы:

  1. Как я могу использовать bashаргумент сценария (или bashпеременный) в моей awkкоманде?
  2. Как обрабатывать двойные кавычки как часть значения поля?
Задан 07/11/2018 в 20:03
источник пользователем
На других языках...                            


1 ответов

голоса
2

Переменные не раскладываются в одинарные кавычки. Правильный путь заключается в использовании -vопции для awkинициализации переменных:

awk -v ts="$ts" -v st="$st" -F, '$1 >= st && $1 < st' "$file.in" > "$file.out"

Отметим также , используя -Fдля инициализации FS, и вам не нужно , { print $0 }так как это действие по умолчанию , если условие истинно.

Ответил 07/11/2018 в 20:07
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more