Mit Tabellen arbeiten

Eine der häufigsten Arten mit Daten zu arbeiten geschieht in Nu durch Tabelle. Nu 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 Nu 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 Nu 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   │
...