# テーブルを扱う

Nuでデータを表示する一般的な方法はテーブルを使用することです。Nuには、探しているものを見つけやすくしたり、必要なデータを絞り込んだりするのに便利なテーブルを操作するためのコマンドがたくさん用意されています。

まずはじめに、今回利用するテーブルを確認しましょう。

> 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 
───┴───────────────┴──────┴─────────┴────────────

# データのソート

ソートに利用する列名を指定して、sort-byコマンドを呼びだすことでテーブルをソートできます。ファイルのサイズでテーブルをソートしたいとしましょう。

> 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 
───┴───────────────┴──────┴─────────┴────────────

比較さえできれば任意の列でソートが行なえます。例えば、"name"、"accessed"、または"modified"列でソートすることができます。

# 必要なデータを選択する

列や行を選択することでテーブルから必要なデータを選択できます。テーブルからいくつかの列を選択してみましょう。

> 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 
───┴───────────────┴─────────

こうすることで、より必要とするデータにフォーカスしたテーブルを作ることができます。次にディレクトリからもっとも小さい5つのファイルを表示してみます。

> 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 
───┴──────────────┴──────┴────────┴────────────

もっとも小さいファイルを取得するためにまずサイズでソートし、それからfirst 5を利用してテーブルから最初の5行を返しています。

不要な行をskipすることもできます。上記で返された5行のうち最初の2行をスキップしてみましょう。

> 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 
───┴───────────┴──────┴────────┴────────────

関心のある3行に絞り込みました。

データを選択するための他のコマンドもみてみましょう。テーブルの各行が数字をもつことを疑問に思っているかもしれません。これは単一の行を簡単に指定する方法として機能します。テーブルをファイル名でソートして、nthコマンドを利用してn行目を選択してみましょう。

> 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 | nth 5
──────────┬────────────
 name     │ shapes.rs 
 type     │ File 
 size     │ 4.7 KB 
 modified │ 5 days ago 
──────────┴────────────

# テーブルからデータを取得する

これまでは、テーブルを必要なものだけにトリミングする操作を行ってきました。ときには一歩進んで、列全体ではなく、セル自体の値が必要になるかもしれません。たとえば、ファイル名のリストだけを取得したいとしましょう。この場合getコマンドを利用することができます。

> 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 
───┴───────────────

これで各ファイルの名前が取得できました。

これはさきほどみたselectコマンドと同じにみえるかもしれません、比較のためにselectコマンドの出力もみておきましょう。

> 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 
───┴───────────────

両者は非常に似ています!両者の違いを明確にしておきましょう。

  • select - 指定された列のみを含む新しいテーブルを作成します
  • get - 指定された列内の値を返します

テーブルからこれらを区別する方法の一つは、value列名です。これにより値のリストであることがわかります。

getコマンドは、パスを受け取りテーブル内のより深いデータへアクセスすることができます。これにより.jsonファイルにあるような複雑なデータを簡単に操作することができます。

# テーブルのデータを変更する

テーブルからデータを選択することに加えて、テーブルの内容を更新することもできます。新しい列を加えたり、セルの内容を編集したりできるのです。Nuでは、その場で編集するのではなく、パイプラインの各コマンドは新しいテーブルを返します。

# 新しい列を追加する

addコマンドを使用して、新しい列をテーブルに追加できます。例をみてみましょう。

> open rustfmt.toml
─────────┬──────
 edition │ 2018 
─────────┴──────

値が2021の"next_edition"列を追加してみましょう。

> open rustfmt.toml | insert next_edition 2021
──────────────┬──────
 edition      │ 2018 
 next_edition │ 2021 
──────────────┴──────

元のファイルは変更されていないことに注意してください。

> open rustfmt.toml
─────────┬──────
 edition │ 2018 
─────────┴──────

Nuの変更は永続的な変更ではなく、値自体に作用する関数的な変更です。これにより、結果を書き出す準備ができるまでパイプライン上で様々な種類の作業をおこなうことができます。ここでは、saveコマンドを使用して結果を書き出すことができます。

> open rustfmt.toml | insert next_edition 2021 | save rustfmt2.toml
> open rustfmt2.toml
──────────────┬──────
 edition      │ 2018 
 next_edition │ 2021 
──────────────┴──────

# 列を更新する

insertコマンドと同様に、updateコマンドを利用して列の内容を新しい値に変更することもできます。実際に動作を確認するために同じファイルを開いてみましょう。

> open rustfmt.toml
─────────┬──────
 edition │ 2018 
─────────┴──────

今度は、サポートした次のeditionを指定するよう更新しましょう。

> open rustfmt.toml | update edition 2021
─────────┬──────
 edition │ 2021 
─────────┴──────

# 値を増やす

数字やバージョンを扱う際に便利なコマンドがもうひとつあります、incです。

> open rustfmt.toml
─────────┬──────
 edition │ 2018 
─────────┴──────
> open rustfmt.toml | inc edition
─────────┬──────
 edition │ 2019 
─────────┴──────

"edition"の値は数字なので、incを使って更新することができます。バージョンを扱う際にはincがその真価を発揮します。

> open Cargo.toml | get package.version
0.1.3
> open Cargo.toml | inc package.version --minor | get package.version
0.2.0

バージョンを扱う際には、フラグを利用して、バージョンのインクリメント方法を指定できます。

  • --major - メジャーバージョンをインクリメント (0.1.3 -> 1.0.0)
  • --minor - マイナーバージョンをインクリメント (0.1.3 -> 0.2.0)
  • --patch - パッチバージョンをインクリメント (0.1.3 -> 0.1.4)