使用shell脚本在csv中的纪元时间之间提取数据

时间:2015-03-16 19:54:10

标签: shell csv awk

我正在尝试处理以下示例数据:

Amanda,1.00,1418691511,Non-Technical,v1
Charles,7.05,1417093994,Technical,v1
Christopher,7.00,1417102400,Technical,v2
David,4.00,1417093447,Non-Technical,v1
John,4.75,1417059582,Technical,v1
John,7.80,1417102602,Technical,v2
Joseph,7.80,1417093804,Technical,v1
Joseph,5.00,1423504662,Technical,v2
Michael,7.55,1417092924,Technical,v1
Richard,5.00,1417093649,Non-Technical,v1
Robert,3.00,1417092640,Non-Technical,v1
Thomas,6.75,1417102170,Technical,v1
William,4.50,1417093255,Non-Technical,v1
rd,2.00,1426017161,Technical,v8
rd,2.75,1426449217,Technical,v9

此处csv中的第三列是各个记录的纪元日期格式时间戳。

我想提取仅在今天和过去3天之间有时间戳的数据。

以下是我过去常常实现的目标,但它似乎对我不起作用。

awk -F , '{if ($3 >= system("date +%s --date="3 days ago"") && $3 <= system("date +%s")) { print }}'

你能帮我理解这里出了什么问题吗?

3 个答案:

答案 0 :(得分:3)

此命令中的双引号不能按您的要求运行:

awk -F , '{if ($3 >= system("date +%s --date="3 days ago"") && $3 <= system("date +%s")) { print }}'
                                             ^          ^

这两个标记的问题会引起麻烦。

我可能会使用:

awk -F, -v old=$(date +%s --date="3 days ago") -v new=$(date +s) \
    '{ if ($3 >= old && $3 <= new) print }'

甚至:

awk -F, -v old=$(date +%s --date="3 days ago") -v new=$(date +s) \
    '$3 >= old && $3 <= new'

有时候system是必要的,但要把它当作一种难闻的气味来对待它。通常情况下,如果仔细考虑,实际上并不是必需的。

答案 1 :(得分:2)

awk中的system命令将输出打印到屏幕,而不是返回字符串。我建议将两个变量传递给awk:

awk -F, -vp="$(date +%s --date="3 days ago")" -vc="$(date +%s)" '$3 >= p && $3 <= c' file

在这种情况下完全没必要使用if - awk的语法为condition { action },默认操作为{print $0}(或等效{print}

答案 2 :(得分:1)

如果您有GNU awk,则无需使用date实用程序; gawk有一个内置systime()函数:

awk -F , 'BEGIN { now = systime(); then = now - 259200 } $3 >= then && $3 <= now'

(259200 = 3 * 24 * 60 * 60是三天秒)。