Enumere los cumpleaños en el orden en que aparecerán hoy

Enumere los cumpleaños en el orden en que aparecerán hoy

Tengo un archivo de texto que contiene cumpleaños:

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

quiero mostrar los cumpleañosdesde la fecha 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?

Descubrí cómo dividir un archivo de texto según un patrón.(Luego podría concatenar las divisiones en el orden opuesto)pero aquí el truco es que la fecha de hoy puede estar ausente o puede ser el cumpleaños de varias personas.

Nota: todas las fechas son fechas válidas.

Respuesta1

Quizás 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}'

Es decir, inserte una 04/07 0000línea ( date +%-m/%-dsaldría 4/7con algunas dateimplementaciones pero no es portátil y 04/07funciona igual de bien) antes de ordenar por fecha, y luego mueva awklas líneas anteriores a esa hasta el final.

sort ... - birthdays.txt

ordena tanto su entrada estándar (representada por -, aquí una tubería alimentada por date) como el contenido de birthdays.txt.

Establecemos el separador de claves en /with -t/, -k1especifica una clave de clasificación que va desde el principio hasta el final de la línea (en esencia, -k1especifica la línea completa como una clave de clasificación) y -k2una clave de clasificación que comienza desde el primer carácter después del primero /hasta el final. final de la línea, pero con -n, se interpretan como números, 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 instalarlo bashsolo para eso).

Respuesta2

Primero cambie "/" en el espacio y ordene

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

A continuación, genere las siguientes fechas antes y la anterior después

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

información relacionada