Listet die Geburtstage in der Reihenfolge auf, in der sie heute vorkommen.

Listet die Geburtstage in der Reihenfolge auf, in der sie heute vorkommen.

Ich habe eine Textdatei mit Geburtstagen:

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

Ich möchte die Geburtstage anzeigenab dem heutigen Datum.
Wenn heute beispielsweise der 4.7. (7. April) ist:

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

Wie macht man das in einem Bash-Skript?

Ich habe herausgefunden, wie man eine Textdatei basierend auf einem Muster aufteilt(Ich könnte die Teilungen dann in umgekehrter Reihenfolge aneinanderreihen)Der Trick dabei ist allerdings, dass das heutige Datum fehlen könnte oder mehrere Personen Geburtstag haben könnten.

Hinweis: Alle Daten sind gültige Daten.

Antwort1

Vielleicht so etwas wie:

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}'

Das heißt, fügen Sie vor dem Sortieren nach Datum eine 04/07 0000Zeile ein ( date +%-m/%-dwürde 4/7bei einigen dateImplementierungen eine Ausgabe erzeugen, ist aber nicht portabel und 04/07funktioniert genauso gut) und verschieben Sie dann awkdie Zeilen davor an das Ende.

sort ... - birthdays.txt

sortiert sowohl seinen Standardeingang (dargestellt durch -, hier eine Pipe, die von gespeist wird date) als auch den Inhalt von birthdays.txt.

Wir setzen den Schlüsseltrenner auf /mit -t/, -k1gibt einen Sortierschlüssel an, der vom Anfang bis zum Ende der Zeile läuft ( -k1gibt im Wesentlichen die gesamte Zeile als Sortierschlüssel an), und -k2einen Sortierschlüssel, der mit dem ersten Zeichen nach dem ersten beginnt und /bis zum Ende der Zeile reicht, aber mit -nwerden diese als Zahlen interpretiert, sodass nur die anfängliche Ziffernfolge von Bedeutung ist.

(das oben genannte würde mit jeder Bourne-ähnlichen Shell (einschließlich ) funktionieren bash, es ist keine spezielle Installation bashdafür nötig).

Antwort2

Zuerst "/" in Leerzeichen ändern und sortieren

sed 's|/| |' data | sort -k1,1n -k2,2n >out.tmp

Als nächstes geben Sie die nächsten Daten vor und die vorherigen nach aus

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

verwandte Informationen