O que é necessário aqui é um comando que gere seis datas em um intervalo de anos (1987 a 2017). Por exemplo:
12/10/1987
30/04/1998
22/02/2014
17/08/2017
19/07/2011
14/05/2004
Como isso poderia ser feito, com sed
, gawk
, etc?
O que é necessário aqui é um comando que gere seis datas em um intervalo de anos (1987 a 2017). Por exemplo:
12/10/1987
30/04/1998
22/02/2014
17/08/2017
19/07/2011
14/05/2004
Como isso poderia ser feito, com sed
, gawk
, etc?
Com
date
,shuf
exargs
:Converta as datas de início e término em "segundos desde 1970-01-01 00:00:00 UTC" e use
shuf
para imprimir seis valores aleatórios nesse intervalo. Encaminhe esse resultadoxargs
e converta os valores para o formato de data desejado.Editar: Se você quiser que as datas do ano de 2017 sejam incluídas na saída, adicione um ano -1s (
2017-12-31 23:59:59
) à data de término.shuf -i
gera números aleatórios, incluindo início e fim.Saída de exemplo:
Você pode transformar o problema em gerar um número aleatório entre um número que representa a primeira data possível e um número que representa a última data possível (na verdade, aquela logo após a última possível), no formato unix epoch. Todo o resto é tratado por conversões de data padrão.
gawk
tem uma resolução de número aleatório melhor do quebash
(float vs 15 bits integer), então usareigawk
. Observe que orand()
resultado N é um float tal que 0 <= N < 1, por isso o limite superior é aumentado abaixo, é um limite que não pode ser rolado. Há um terceiro parâmetro opcional para o número de resultados.Por exemplo:
Perl:
Saída de amostra:
Aqui está uma maneira, principalmente em awk:
O shell script pega dois parâmetros e os passa como variáveis para o awk, que não lê nenhuma entrada e faz todo o trabalho no
BEGIN
bloco.Depois de semear o gerador de números aleatórios, ele faz um loop 6 vezes em uma
printf
instrução. Essa instrução print seleciona um subconjunto das datas possíveis no intervalo, gerando um número aleatório entre 1 e 28 para o dia (sendo seguro para fevereiro), entre 1 e 12 para o mês e entre os anos de início e término fornecidos. É aleatório, mas não é uma cobertura completa - nunca imprimirá os dias 29-31 nos meses que os tiverem.Outra maneira, usando os recursos de data e bash do GNU:
Ele funciona calculando os segundos desde o epoc de 1º de janeiro na data de início e, em seguida, para cada um dos loops, ele apresenta um número aleatório de segundos de deslocamento a serem adicionados; o número aleatório é limitado ao número de segundos que abrangem o intervalo fornecido. A data GNU então manipula essa data no formato desejado.
Se a diferença no número de anos for inferior a cerca de 90, você pode usar a
$RANDOM
variável no bash para fornecer um deslocamento no número de dias e usar a capacidade limitada dodate
comando para fazer o cálculo.O loop interno para selecionar o número aleatório tenta corrigir o viés. Se uma fonte de números aleatórios puder fornecer 0, 1, 2, 3, 4, 5, 6, 7, 8 ou 9 igualmente e você quiser um número aleatório entre 0 e 3 inclusive, se você obtiver 0 ou 1 da fonte você reporta 0, se tira 2 ou 3, então reporta 1, se tira 4 ou 5 reporta 2, se tira 6 ou 7 reporta 3, e se tira 8 ou 9 você ignora este número da fonte .