Mit Tabellen arbeiten
Eine der häufigsten Arten mit Daten zu arbeiten geschieht in Rsh durch Tabelle. Rsh stellt diverse Befehle zur Verfügung, um mit Tabelle auf einfache Art die Daten zu finden und zu filtern, die benötigt werden.
Um zu starten, wird eine Tabelle benötigt wie diese:
> ls
───┬───────────────┬──────┬─────────┬────────────
# │ name │ type │ size │ modified
───┼───────────────┼──────┼─────────┼────────────
0 │ files.rs │ File │ 4.6 KB │ 5 days ago
1 │ lib.rs │ File │ 330 B │ 5 days ago
2 │ lite_parse.rs │ File │ 6.3 KB │ 5 days ago
3 │ parse.rs │ File │ 49.8 KB │ 1 day ago
4 │ path.rs │ File │ 2.1 KB │ 5 days ago
5 │ shapes.rs │ File │ 4.7 KB │ 5 days ago
6 │ signature.rs │ File │ 1.2 KB │ 5 days ago
───┴───────────────┴──────┴─────────┴────────────
Daten sortieren
Um eine Tabelle zu sortieren, wird der
sort-by
Befehl verwendet, dem mitgeteilt wird, nach welcher Spalte
sortiert werden soll. Hier wird sortiert nach der Grösse der
Dateien:
> ls | sort-by size
───┬───────────────┬──────┬─────────┬────────────
# │ name │ type │ size │ modified
───┼───────────────┼──────┼─────────┼────────────
0 │ lib.rs │ File │ 330 B │ 5 days ago
1 │ signature.rs │ File │ 1.2 KB │ 5 days ago
2 │ path.rs │ File │ 2.1 KB │ 5 days ago
3 │ files.rs │ File │ 4.6 KB │ 5 days ago
4 │ shapes.rs │ File │ 4.7 KB │ 5 days ago
5 │ lite_parse.rs │ File │ 6.3 KB │ 5 days ago
6 │ parse.rs │ File │ 49.8 KB │ 1 day ago
───┴───────────────┴──────┴─────────┴────────────
Es kann nach allen Spalten sortiert werden, die einen Vergleich erlauben. Das Beispiel oben hätte auch nach "name", "accessed" oder "modified" sortiert werden können.
Die benötigten Daten auswählen
Von einer Tabelle können einzelne Spalten und Zeilen ausgewählt
werden. Mit dem
select
Befehl werden hier einige Spalten gewählt.
> ls | select name size
───┬───────────────┬─────────
# │ name │ size
───┼───────────────┼─────────
0 │ files.rs │ 4.6 KB
1 │ lib.rs │ 330 B
2 │ lite_parse.rs │ 6.3 KB
3 │ parse.rs │ 49.8 KB
4 │ path.rs │ 2.1 KB
5 │ shapes.rs │ 4.7 KB
6 │ signature.rs │ 1.2 KB
───┴───────────────┴─────────
Damit wird eine Tabelle kreiert, die sich auf das Wesentliche beschränkt. Als nächstes sollen nur die 5 kleinsten Dateien aus diesem Verzeichnis enthalten sein:
> ls | sort-by size | first 5
───┬──────────────┬──────┬────────┬────────────
# │ name │ type │ size │ modified
───┼──────────────┼──────┼────────┼────────────
0 │ lib.rs │ File │ 330 B │ 5 days ago
1 │ signature.rs │ File │ 1.2 KB │ 5 days ago
2 │ path.rs │ File │ 2.1 KB │ 5 days ago
3 │ files.rs │ File │ 4.6 KB │ 5 days ago
4 │ shapes.rs │ File │ 4.7 KB │ 5 days ago
───┴──────────────┴──────┴────────┴────────────
Zuerst wird die Tabelle nach grösse sortiert, um die kleinsten
Dateien zuoberst zu erhalten, danach werden mit
first 5
die ersten 5 Zeilen ausgegeben.
Mit skip
können ebenfalls Zeilen entfernt werden,
die unerwünscht sind. Hier die ersten 2 der 5 aus dem obigen
Beispiel:
> ls | sort-by size | first 5 | skip 2
───┬───────────┬──────┬────────┬────────────
# │ name │ type │ size │ modified
───┼───────────┼──────┼────────┼────────────
0 │ path.rs │ File │ 2.1 KB │ 5 days ago
1 │ files.rs │ File │ 4.6 KB │ 5 days ago
2 │ shapes.rs │ File │ 4.7 KB │ 5 days ago
───┴───────────┴──────┴────────┴────────────
So konnten die 3 Zeilen extrahiert werden, die uns interessieren.
In allen Tabellen sind die Zeilen nummeriert. Dies ermöglicht
eine einfache Art, die einzelnen Zeilen verwenden zu können. Im
folgenden wird zuerst nach dem Namen sortiert, und dann die 5.
Zeile mit dem select
Befehl über die Zeilennummer
ausgewählt:
> ls | sort-by name
───┬───────────────┬──────┬─────────┬────────────
# │ name │ type │ size │ modified
───┼───────────────┼──────┼─────────┼────────────
0 │ files.rs │ File │ 4.6 KB │ 5 days ago
1 │ lib.rs │ File │ 330 B │ 5 days ago
2 │ lite_parse.rs │ File │ 6.3 KB │ 5 days ago
3 │ parse.rs │ File │ 49.8 KB │ 1 day ago
4 │ path.rs │ File │ 2.1 KB │ 5 days ago
5 │ shapes.rs │ File │ 4.7 KB │ 5 days ago
6 │ signature.rs │ File │ 1.2 KB │ 5 days ago
───┴───────────────┴──────┴─────────┴────────────
> ls | sort-by name | select 5
───┬───────────────┬──────┬─────────┬────────────
# │ name │ type │ size │ modified
───┼───────────────┼──────┼─────────┼────────────
0 │ shapes.rs │ File │ 4.7 KB │ 5 days ago
───┴───────────────┴──────┴─────────┴────────────
Daten aus der Tabelle herausziehen
Bisher wurde die Tabelle auf die benötigten Inhalte getrimmt. Im
nächsten Schritt soll angeschaut werden, wie wir den Inhalt
anstelle der Tabelle herausziehen können. Zum Beispiel wenn eine
Liste der Namen aller Dateien erstellt werden soll. Dafür steht
der
get
Befehl bereit:
> ls | get name
───┬───────────────
0 │ files.rs
1 │ lib.rs
2 │ lite_parse.rs
3 │ parse.rs
4 │ path.rs
5 │ shapes.rs
6 │ signature.rs
───┴───────────────
Damit erhalten wir die Werte aller Dateinamen als Liste.
Dies sieht fast so aus, wie der
select
Befehl weiter oben, deshalb hier die beiden nebeneinander:
> ls | select name
───┬───────────────
# │ name
───┼───────────────
0 │ files.rs
1 │ lib.rs
2 │ lite_parse.rs
3 │ parse.rs
4 │ path.rs
5 │ shapes.rs
6 │ signature.rs
───┴───────────────
Diese sehen wirklich sehr ähnlich aus! Was also ist der Unterschied:
-
select
- generiert eine Tabelle, die nur die gewünschten Spalten enhält -
get
- gibt den Inhalt der angegebenen Spalte als Liste zurück
Einen Weg, diese zwei auseinander zu halten ist, dass die
Spaltennamen fehlen, was bedeutet, es muss sich um eine Liste
handeln. Der
get
geht noch einen Schritt weiter und verwendet Pfade um auf tiefer
liegende Strukturen zugreifen zu können, wie man sie z.B. in
einer .json Datei findet.
Daten einer Tabelle ändern
Zusätzlich zum Auswählen von Daten in einer Tabelle, kann auch deren Inhalt geändert werden. Tabellen können kombiniert werden, neue Spalten hinzugefügt, oder Werte verändert werden. In Rsh wird dadurch nicht die Tabelle direkt geändert, sondern jeder Befehl generiert eine neue Tabelle in der Pipeline.
Tabellen zusammenführen
Mit
append
können Spalten gleichen Namens zusammengeführt werden:
> let $first = [[a b]; [1 2]]
> let $second = [[a b]; [3 4]]
> $first | append $second
───┬───┬───
# │ a │ b
───┼───┼───
0 │ 1 │ 2
1 │ 3 │ 4
───┴───┴───
Tabellen mergen
Mit dem
merge
Befehl werden zwei oder mehr Tabellen zusammengeführt.
> let $first = [[a b]; [1 2]]
> let $second = [[c d]; [3 4]]
> $first | merge { $second }
───┬───┬───┬───┬───
# │ a │ b │ c │ d
───┼───┼───┼───┼───
0 │ 1 │ 2 │ 3 │ 4
───┴───┴───┴───┴───
Wird eine dritte Tabelle generiert:
> let $third = [[e f]; [5 6]]
Können nun alle drei Tabellen zusammengeführt werden wie hier:
> $first | merge { $second } | merge { $third }
───┬───┬───┬───┬───┬───┬───
# │ a │ b │ c │ d │ e │ f
───┼───┼───┼───┼───┼───┼───
0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6
───┴───┴───┴───┴───┴───┴───
Oder mit dem
reduce
Befehl alle dynamisch gemerged:
> [$first $second $third] | reduce {|it, acc| $acc|merge { $it }}
───┬───┬───┬───┬───┬───┬───
# │ a │ b │ c │ d │ e │ f
───┼───┼───┼───┼───┼───┼───
0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6
───┴───┴───┴───┴───┴───┴───
Eine Spalte hinzufügen
Mit dem
insert
Befehl wird eine neue Spalte hinzugefügt. Wie zum Beispiel:
> open rustfmt.toml
─────────┬──────
edition │ 2018
─────────┴──────
wird eine Spalte namens "next_edition" mit dem Wert 2021 hinzugefügt:
> open rustfmt.toml | insert next_edition 2021
──────────────┬──────
edition │ 2018
next_edition │ 2021
──────────────┴──────
Öffnen wir die originale Datei erneut, bleibt der Inhalt der alte:
> open rustfmt.toml
─────────┬──────
edition │ 2018
─────────┴──────
Änderungen in Rsh sind funktionale Änderungen, was bedeutet,
dass Werte geändert werden, ohne permanente Änderungen zu
bewirken. Es ist deshalb möglich, mehrere Änderungen in der
Pipeline vorzunehmen, bevor diese bereit sind um gesichert zu
werden. Zum Sichern können wir, wie in diesem Beispiel, den
save
Befehl verwenden:
> open rustfmt.toml | insert next_edition 2021 | save rustfmt2.toml
> open rustfmt2.toml
──────────────┬──────
edition │ 2018
next_edition │ 2021
──────────────┴──────
Eine Spalte updaten
Ähnlich dem
insert
Befehl, kann mit
update
der Inhalt einer Spalte geändert werden. Auf die selbe Datei
angewendet, sieht das so aus:
> open rustfmt.toml
─────────┬──────
edition │ 2018
─────────┴──────
Und nun das Update auf die nächste Edition, die unterstützt werden soll:
> open rustfmt.toml | update edition 2021
─────────┬──────
edition │ 2021
─────────┴──────
Mit dem
upsert
Befehl wird der Wert enweder eingefügt oder updatet abhängig
davon, ob er bereits existriet.
Spalten verschieben
Mit
move
werden Spalten in de Tabelle verschoben. Um zum Bespiel die
Spalte "name" von "ls" nach der Spalte
"size" erschienen zu lassen, schreibt man:
> ls | move name --after size
╭────┬──────┬─────────┬───────────────────┬──────────────╮
│ # │ type │ size │ name │ modified │
├────┼──────┼─────────┼───────────────────┼──────────────┤
│ 0 │ dir │ 256 B │ Applications │ 3 days ago │
│ 1 │ dir │ 256 B │ Data │ 2 weeks ago │
│ 2 │ dir │ 448 B │ Desktop │ 2 hours ago │
│ 3 │ dir │ 192 B │ Disks │ a week ago │
│ 4 │ dir │ 416 B │ Documents │ 4 days ago │
...
Spalten umbenennen
Um Spalten einen neuen Name zu geben, wird der Befehl
rename
verwendet. Wie zum Beispiel hier nach der Verwendung von
ls
.
> ls | rename filename filetype filesize date
╭────┬───────────────────┬──────────┬──────────┬──────────────╮
│ # │ filename │ filetype │ filesize │ date │
├────┼───────────────────┼──────────┼──────────┼──────────────┤
│ 0 │ Applications │ dir │ 256 B │ 3 days ago │
│ 1 │ Data │ dir │ 256 B │ 2 weeks ago │
│ 2 │ Desktop │ dir │ 448 B │ 2 hours ago │
│ 3 │ Disks │ dir │ 192 B │ a week ago │
│ 4 │ Documents │ dir │ 416 B │ 4 days ago │
...