Обработка записей файла журнала с двойными кавычками на отметке времени - PullRequest
0 голосов
/ 23 октября 2018

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

"2018-10-22 14:38:29", ...comma-separated values...
"2018-10-22 13:18:07", ...comma-separated values...

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

Я могу заставить это работать, когда я жестко кодирую метку времени в моем скрипте ...

# This will work
awk ' 
    BEGIN { FS=" "; split_stamp="\"2018-10-22 14:00:00\"" }
    $1<=split_stamp { print $0 )
' $filename

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

# But this fails silently
split_at="\"2018-10-22 00:00:00\""
awk ' 
    BEGIN { FS=" "; split_stamp=$split_at }
    $1<=split_stamp { print $0 )
' $filename

Есть предложения о том, как обрабатывать двойные кавычки (без необходимости делать отдельную копию файла журнала с удаленными двойными кавычками)?Или, может быть, есть лучший инструмент, чем awk?

1 Ответ

0 голосов
/ 23 октября 2018

Решение с использованием csvtool:

printf "%s\n" '"2018-11-22 13:18:07",aaa' '"2018-09-21 14:38:29",bbb' > input.csv
split_at_ts=$(date --date="2018-10-22 00:00:00" +%s);
func() { 
    declare -g split_at_ts
    local ts
    ts=$(date --date="$1" +%s)
    if ((ts < split_at_ts)); then 
        printf "%s" "$*"
    fi
}
export -f func
export split_at_ts
csvtool call f input.csv

csvtool вызовет функцию f для каждой строки в файле csv с аргументами, равными полям в этом файле csvfile.
Для сравнения двух дат мне нужно преобразовать их всекунд, начиная с эпохи, а затем я сравниваю цифры.Если дата раньше, чем split_at, я печатаю ее из функции func.

...