0

我有包含数百万条记录的 CSV 文件。其中一个字段(例如 $2)包含日期。我需要从上周开始的日期。

我想使用 AWK 将当前日期替换为过去 7 天的随机日期。为此,我想创建一个索引为 1..7 的数组,它的值将是最后 7 个日期(例如 2013-10-08、2013-10-07...)。

是否有可以从给定日期计算日期的函数?或者一些可以完成这项工作的代码?

我在文件中的时间戳是“yyyy-mm-dd hh:mm:ss”。

更新 - 答案

这终于满足了我的需求:

BEGIN { srand() } 
{ 
  split($2, a, "-") 
  t  = mktime(a[1] " " a[2] " " substr(a[3], 1, 2) " 00 00 00") 
  $2 = strftime("%Y-%m-%d %H:%M:%S", t - int(7*rand()+1) * 3600 * 24 + int(3600*24*rand())) 
}
1
4

2 回答 2

1

我假设你有这样的事情:

data1,2013-10-04,data2,...

并且您想将第二列日期更改为过去 7 天内的随机日期。

mktime这对于拥有andstrftime命令的 GNU awk 来说相当简单。

这是一个适用于上面列出的输入的 gawk 脚本 ( rnd_date.awk ):

BEGIN { srand() }
{
  split($2, a, /-/)
  t  = mktime(a[1] " " a[2] " " a[3] " 00 00 00")
  $2 = strftime("%F", t - int(7*rand()+1) * 3600 * 24)
}
1

像这样运行它:

awk -f rnd_date.awk FS=, OFS=, infile

示例输出:

data1,2013-09-29,data2,...

有几点需要注意:

  1. srand使用“自纪元以来的秒数”为伪随机数生成器播种,因此如果您快速调用此脚本,则每次调用之间将没有随机性。您可以通过提供更好的种子来解决这个问题,例如使用 GNU 日期:

    awk -f rnd_date -v s=$(date +%N) 'BEGIN { srand(s) } ...'

  2. 设置$2将强制重新格式化整行,这取决于您的数据格式,这可能是也可能不是问题。

编辑

我明白了,您的数据格式不同,您有:

data1,2013-10-04 01:01:01,data2,...

您可以像这样调整上述内容(使用更好的命名变量):

BEGIN { srand() }
{
  split($2, date, /-| |:/)
  since_epoch = mktime(date[1] " " date[2] " " date[3] " " date[4] " " date[5] " " date[6])
  $2 = strftime("%F %T", since_epoch - int(7*rand()+1) * 3600 * 24)
}
1

或者如果你不关心这个HH:MM:SS部分

BEGIN { srand() }
{
  split($2, a, /-| /)
  t  = mktime(a[1] " " a[2] " " a[3] " 00 00 00")
  $2 = strftime("%F %T", t - int(7*rand()+1) * 3600 * 24)
}
1

示例输出:

data1,2013-09-27 00:00:00,data2,...
于 2013-10-08T11:00:35.037 回答
0

你可以做一些这样的awk

awk '$2>=from && $2<=to' from="$(date +%b" "%e" "%H:%M:%S -d -7days)" to="$(date +%b" "%e" "%H:%M:%S)" file

您需要调整date命令以提供与包含日期的字段中的日期相同的输出$2。然后这将为您提供最近 7 天的数据

于 2013-10-08T10:52:50.213 回答