
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 0000
linha ( date +%-m/%-d
daria saída 4/7
com algumas date
implementações, mas não é portátil e 04/07
funciona tão bem) antes de classificar por data e, em seguida, mova awk
as 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/
, -k1
especificamos uma chave de classificação que é executada do início ao fim da linha (em essência, -k1
especifica a linha completa como uma chave de classificação) e -k2
uma 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 bash
apenas 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