今日から誕生日順にリストします

今日から誕生日順にリストします

誕生日を含むテキスト ファイルがあります。

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

は、その 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

関連情報