Перечислите дни рождения в том порядке, в котором они наступают сегодня.

Перечислите дни рождения в том порядке, в котором они наступают сегодня.

У меня есть текстовый файл, содержащий дни рождения:

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

Я хочу отобразить дни рожденияс сегодняшнего дня.
Например, если сегодня 4/7 (7 апреля):

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

Как это сделать в bash-скрипте?

Я нашел, как разделить текстовый файл на основе шаблона.(Затем я мог бы объединить разделения в обратном порядке)но тут фокус в том, что сегодняшняя дата может отсутствовать или может быть днем ​​рождения сразу нескольких человек.

Примечание: все даты действительны.

решение1

Может быть, что-то вроде:

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}'

То есть вставьте 04/07 0000строку ( date +%-m/%-dбудет выводиться 4/7в некоторых dateреализациях, но непереносима и 04/07работает так же хорошо) перед сортировкой по дате, а затем переместите awkстроки, которые находятся до этой, в конец.

sort ... - birthdays.txt

сортирует как свой stdin (представленный как -, здесь это канал, который питается от date), так и содержимое birthdays.txt.

Мы устанавливаем разделитель ключей на /, -t/указываем -k1ключ сортировки, который выполняется от начала до конца строки (по сути, -k1указываем всю строку как ключ сортировки), и -k2ключ сортировки, который начинается с первого символа после первого и /заканчивается в конце строки, но при -n, они интерпретируются как числа, поэтому имеет значение только начальная последовательность цифр.

(вышеуказанное будет работать с любой оболочкой типа Bourne (включая bash), для этого нет необходимости устанавливать bashчто-либо).

решение2

Сначала замените "/" в пробеле и отсортируйте

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

Далее выведите следующие даты до и после

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

Связанный контент