处理时间戳上带有双引号的日志文件条目

时间:2018-10-22 21:29:41

标签: bash date awk timestamp quotes

我有一个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 :(得分:0)

使用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将为csv文件中的每一行调用函数f,其参数等于该csvfile中的字段。
要比较两个日期,我需要将它们转换为自纪元以来的秒数,然后再比较数字。如果日期早些,那么split_at我将从函数func内部打印它。