Anota los cumpleaños en el order en que vendrán hoy

Tengo un file de text que contiene cumpleaños:

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

Quiero mostrar los cumpleaños de la date de hoy .
Por ejemplo, si hoy es 4/7 (7 de abril):

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

¿Cómo hacer esto en un script bash?

He encontrado cómo dividir un file de text basado en un patrón (podría concatenar las divisiones en el order opuesto) pero aquí el truco es que la date de hoy podría estar ausente, o podría ser el cumpleaños de varias personas.

Nota: todas las dates son dates válidas.

Tal vez algo así 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}' 

Es decir, inserte una línea 04/07 0000 ( date +%-m/%-d generaría salida 4/7 con algunas implementaciones de date , pero no es portátil, y 04/07 funciona igual de bien) antes de orderar por date, y luego has awk mueve las líneas que están antes de esa hasta el final.

 sort ... - birthdays.txt 

ordera tanto su stdin (representado por - , aquí una tubería que se alimenta por date ) como el contenido de birthdays.txt .

Configuramos el separador de keys en / con -t/ , -k1 especifica una key de sorting que se ejecuta de principio a fin de la línea (en esencia, -k1 especifica la línea completa como una key de sorting) y -k2 una key de sorting que comienza desde el primer carácter después del primero / hasta el final de la línea, pero con -n , estos se interpretan como numbers, por lo que solo importa la secuencia inicial de dígitos.

(lo anterior funcionaría con cualquier shell tipo Bourne (incluido bash ), no es necesario instalar bash solo para eso).

Primero cambie "/" en el espacio y clasifique

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

A continuación, imprima las siguientes dates antes y la anterior

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