
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 0000
Zeile ein ( date +%-m/%-d
würde 4/7
bei einigen date
Implementierungen eine Ausgabe erzeugen, ist aber nicht portabel und 04/07
funktioniert genauso gut) und verschieben Sie dann awk
die 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/
, -k1
gibt einen Sortierschlüssel an, der vom Anfang bis zum Ende der Zeile läuft ( -k1
gibt im Wesentlichen die gesamte Zeile als Sortierschlüssel an), und -k2
einen Sortierschlüssel, der mit dem ersten Zeichen nach dem ersten beginnt und /
bis zum Ende der Zeile reicht, aber mit -n
werden 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 bash
dafü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