
У меня есть текстовый файл, содержащий дни рождения:
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