Awk
給定年份間隔,如何生成隨機日期序列?
這裡需要一個在給定年份範圍(1987 到 2017)的情況下生成六個日期的命令。例如:
12/10/1987 30/04/1998 22/02/2014 17/08/2017 19/07/2011 14/05/2004
sed
用,gawk
等怎麼做?
您可以將問題轉化為在代表第一個可能日期的數字和代表最後一個可能日期的數字(實際上是最後一個可能日期之後的那個)之間生成一個隨機數,採用 unix 紀元格式。其他一切都由標準日期轉換處理。
gawk
具有比bash
(浮點數與 15 位整數)更好的隨機數解析度,所以我將使用gawk
. 請注意,rand()
結果 N 是一個浮點數,使得 0 <= N < 1,這就是上限提高到以下的原因,這是一個不能滾動的限制。結果數量有一個可選的第三個參數。#!/usr/bin/gawk -f BEGIN { first=mktime(ARGV[1] " 01 01 00 00 00") last=mktime(ARGV[2]+1 " 01 01 00 00 00") if (ARGC == 4) { num=ARGV[3] } else { num=1 } ARGC=1 range=last-first srand(sprintf("%d%06d", systime(), PROCINFO["pid"])) for (i=1; i <= num; i++) { print strftime("%d/%m/%Y", range*rand()+first) } }
例如:
./randomdate.gawk 1987 2017 6 26/04/1992 28/04/2010 21/04/2005 17/02/2010 06/10/2016 04/04/1998
date
,shuf
和xargs
: _將開始和結束日期轉換為“自 1970 年 1 月 1 日 00:00:00 UTC 以來的秒數”,並用於
shuf
在此範圍內列印六個隨機值。將此結果通過管道傳輸到xargs
並將值轉換為所需的日期格式。編輯:
2017-12-31 23:59:59
如果您希望 2017 年的日期包含在輸出中,您需要在結束日期中添加一年 -1s ( )。shuf -i
生成隨機數,包括開始和結束。shuf -n6 -i$(date -d '1987-01-01' '+%s')-$(date -d '2017-01-01' '+%s')\ | xargs -I{} date -d '@{}' '+%d/%m/%Y'
範例輸出:
07/12/1988 22/04/2012 24/09/2012 27/08/2000 19/01/2008 21/10/1994