我正在尝试处理以下示例数据:
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 }}'
你能帮我理解这里出了什么问题吗?
答案 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是三天秒)。