
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 0000
línea ( date +%-m/%-d
saldría 4/7
con algunas date
implementaciones pero no es portátil y 04/07
funciona igual de bien) antes de ordenar por fecha, y luego mueva awk
las 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/
, -k1
especifica una clave de clasificación que va desde el principio hasta el final de la línea (en esencia, -k1
especifica la línea completa como una clave de clasificación) y -k2
una 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 bash
solo 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