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

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

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

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

我想显示生日从今天起
例如,如果今天是 4/7(4 月 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/7date04/07awk

sort ... - birthdays.txt

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

我们将键分隔符设置为/with -t/-k1指定从行首到行尾的排序键(本质上,-k1指定整行作为排序键),以及从第一个字符后的第一个字符开始到第一个字符-k2的排序键。/行尾,但对于-n,这些被解释为数字,因此只有初始数字序列很重要。

(以上内容适用于任何类似 Bourne 的 shell(包括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

相关内容