按今天開始的順序列出生日

按今天開始的順序列出生日

我有一個包含生日的文字檔:

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

相關內容