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 linha 04/07 0000 ( date +%-m/%-d produziria 4/7 com algumas implementações date , mas não é portátil e 04/07 funciona tão bem) antes de classificar por data e, em seguida, ter awk move as linhas que estão antes daquela para o final.
sort ... - birthdays.txt
classifica seu stdin (representado por - , aqui um pipe alimentado por date ) e o conteúdo de birthdays.txt .
Definimos o separador de chaves como / com -t/ , -k1 especifica uma chave de classificação 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 no 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 parecido com o Bourne (incluindo bash ), não é necessário instalar bash apenas para isso).