我假设你有这样的事情:
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,...
有几点需要注意:
srand
使用“自纪元以来的秒数”为伪随机数生成器播种,因此如果您快速调用此脚本,则每次调用之间将没有随机性。您可以通过提供更好的种子来解决这个问题,例如使用 GNU 日期:
awk -f rnd_date -v s=$(date +%N) 'BEGIN { srand(s) } ...'
设置$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,...