Liste os aniversários na ordem em que virão hoje

Liste os aniversários na ordem em que virão hoje

Eu tenho um arquivo de texto contendo aniversários:

1/23 Horace
3/1 Taraneh
7/14 Valerian
11/31 Carmen

Quero exibir os aniversáriosa partir da data de hoje.
Por exemplo, se hoje for 7/4 (7 de abril):

7/14 Valerian
11/31 Carmen
1/23 Horace
3/1 Taraneh

Como fazer isso em um script bash?

Eu descobri como dividir um arquivo de texto com base em um padrão(Eu poderia então concatenar as divisões na ordem oposta)mas aqui o truque é que a data de hoje pode estar ausente, ou pode ser o aniversário de várias pessoas.

Nota: todas as datas são datas válidas.

Responder1

Talvez algo como:

date +'%m/%d 0000' |
  sort -nt/ -k1 -k2 - birthdays.txt |
  awk '$2 == "0000" {past_today = 1; next}
       past_today {print; next}
       {next_year = next_year $0 RS}
       END {printf "%s", next_year}'

Ou seja, insira uma 04/07 0000linha ( date +%-m/%-ddaria saída 4/7com algumas dateimplementações, mas não é portátil e 04/07funciona tão bem) antes de classificar por data e, em seguida, mova awkas linhas anteriores a essa para o final.

sort ... - birthdays.txt

classifica seu stdin (representado por -, aqui um canal alimentado por date) e o conteúdo de birthdays.txt.

Definimos o separador de chave como /with -t/, -k1especificamos uma chave de classificação que é executada do início ao fim da linha (em essência, -k1especifica a linha completa como uma chave de classificação) e -k2uma chave de classificação que começa do primeiro caractere após o primeiro /até o final da linha, mas com -n, esses são interpretados como números, portanto, apenas a sequência inicial de dígitos é importante.

(o acima funcionaria com qualquer shell do tipo Bourne (incluindo bash), não há necessidade de instalação bashapenas para isso).

Responder2

Primeiro altere "/" no espaço e classifique

sed 's|/| |' data | sort -k1,1n -k2,2n >out.tmp

Em seguida, produza as próximas datas antes e as anteriores depois

awk -v m=4 -v d=7 '$1 > m || $1 == m && $2 >= d' out.tmp
awk -v m=4 -v d=7 '$1 < m || $1 == m && $2 <  d' out.tmp

informação relacionada