我有一个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
更好的工具?
答案 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内部打印它。