
誕生日を含むテキスト ファイルがあります。
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/7
date
04/07
awk
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