今日から誕生日を順番に並べてください

今日から誕生日を順番に並べてください

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

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数値として解釈されるため、数字の最初の順序だけが重要です。

bash(上記はBourneのようなシェル(含まれています)で動作します。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

関連情報