按照生日从今天开始的顺序列出生日

Nic*_*oul 4 awk perl date sort split

我有一个包含生日的文本文件:

1/23 Horace
3/1 Taraneh
7/14 Valerian
11/31 Carmen
Run Code Online (Sandbox Code Playgroud)

我想显示从今天开始的生日日期
例如,如果今天是 4/7(4 月 7 日):

7/14 Valerian
11/31 Carmen
1/23 Horace
3/1 Taraneh
Run Code Online (Sandbox Code Playgroud)

如何在 bash 脚本中执行此操作?

我已经找到了如何根据模式拆分文本文件(然后我可以以相反的顺序连接拆分)但这里的技巧是今天的日期可能不存在,或者可能是几个人的生日。

注:所有日期均为有效日期。

Sté*_*las 8

也许是这样的:

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}'
Run Code Online (Sandbox Code Playgroud)

也就是说,在按日期排序之前插入04/07 0000一行(date +%-m/%-d将输出4/7一些date实现,但不可移植,并且04/07工作得一样好),然后awk将在该行之前的行移到最后。

sort ... - birthdays.txt
Run Code Online (Sandbox Code Playgroud)

对其标准输入(由 表示-,这里是由 馈送的管道date)和 的内容进行排序birthdays.txt

我们键分离设置为/-t/-k1指定排序关键字是运行从开始到行尾(本质上-k1规定了全行的排序键),并且-k2排序关键字,从第一个字符开始后的第一个/到行尾,但使用-n,这些被解释为数字,因此只有初始数字序列很重要。

(以上适用于任何类似 Bourne 的 shell(包括bash),无需为此安装bash)。