Awk

給定年份間隔,如何生成隨機日期序列?

  • October 20, 2019

這裡需要一個在給定年份範圍(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 &lt;= 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,shufxargs: _

將開始和結束日期轉換為“自 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

引用自:https://unix.stackexchange.com/questions/547338