🕌

Nushellのデータ型について

2022/12/04に公開

データ型

Nushellがサポートしているデータ型を下記に示します。下記の型は変数に格納可能です。

整数型 -65535
数値 (実数) 型 9.9999, Infinity
文字列型 "hole 18", 'hole 18', hole 18, hole18
論理値型 true
日付型 2000-01-01
期間型(Duration) 2min + 12sec
ファイルサイズ型 64mb
範囲型 0..4, 0..<5, 0.., ..4
バイナリ型 0x[FE FF]
リスト型 [0 1 'two' 3]
レコード型 {name:"Nushell", lang: "Rust"}
テーブル型 [{x:12, y:15}, {x:8, y:9}], [[x, y]; [12, 15], [8, 9]]
クロージャ {
Null null

文字列型

動的文字列補完[4]

文字列出力時に()内部のコードが評価されて文字列に反映されます。

❯ $"6 x 7 = (6 * 7)"
6 x 7 = 42

Bare strings

下記のパターンでは文字列をクォートしないまま使えます。

❯ print hello
hello
❯ [foo bar baz]
╭───┬─────╮
│ 0 │ foo │
│ 1 │ bar │
│ 2 │ baz │
╰───┴─────╯
❯ [foo bar baz] | describe
list<string>

エスケープ文字

エスケープ文字 内容
" "(ダブルクォート文字)
' '(シングルクォート文字)
|(バックスラッシュ文字)
/ /(スラッシュ文字)
\b バックスペース
\f フォームフィード
\r 復帰
\n 改行
\t タブ
\uXXXX ユニコード文字(codepoint)

カンマ区切り文字列からリスト・テーブルを作成

splitコマンドでデリミタ文字で区切られた文字列からリスト・テーブルを作成できます。

❯ "red,green,blue" | split row ","     # リストへ
╭───┬───────╮
│ 0 │ red   │
│ 1 │ green │
│ 2 │ blue  │
╰───┴───────╯
❯ "red,green,blue" | split column ","  # テーブルへ
╭───┬─────────┬─────────┬─────────╮
│ # │ column1 │ column2 │ column3 │
├───┼─────────┼─────────┼─────────┤
│ 1 │ red     │ green   │ blue    │
╰───┴─────────┴─────────┴─────────╯

strコマンド

strコマンド群は文字列を入力として、検索・文字列操作を行います。
詳細はhelp str でサブコマンドの内容が確認できます。

❯ "hello world" | str contains "o wo"
true

文字列比較

=~, !~オペレータで比較ができます。右辺値には正規表現が使えます。

❯ 'APL' =~ '^\w{0,3}$'
true
❯ 'FORTRAN' !~ '^\w{0,3}$'
true

色文字

ANSIエスケープを用いて文字に色[5]を付与することができます。

$'(ansi purple_bold)This text is a bold purple!(ansi reset)'
This text is a bold purple!

Duration

数値のあとに時間を表す下記の単位をつけることでdurationとして扱われます。

Duration Length
1ns 1ナノ秒(0.000000001秒)
1us 1マイクロ秒(0.000001秒)
1ms 1ミリ秒(0.001秒)
1sec 1秒
1min 1分
1hr 1時間
1day 1日
1wk 1週間

次はduration同士での演算の例です。

❯ 100ms + 24ms
124ms
❯ (3day + 3hr + 21min) / 1day
3.1395833333333334

次はdateduration間の演算の例です。

❯ date now
Fri, 02 Dec 2022 22:42:42 +0900 (now)
❯ (date now) + 1day
Sat, 03 Dec 2022 22:42:44 +0900 (in a day)

File sizes

File sizes bytes
1b 1 bytes
1kb 1kilobytes (= 1000 bytes)
1mb 1megabytes
gb 1gigabytes
tb 1terabytes
pb 1petabytes
1eb 1exabytes
1zb 1zettabyte
1kib 1kibibytes (=1024 bytes)
1mib 1mebibytes
1gib 1gibibytes
1tib 1tebibytes
1pib 1pebibytes
1eib 1exbibyte
1zib 1zebibyte

duration同様に演算可能です。

❯ 1kb + 3kb
4.0 KB
❯ 1Gb / 1b
1000000000
❯ 1Gib / 1b
1073741824
❯ (1Gib / 1b) == 2 ** 30
true

Ranges

範囲を示す型となります。基本の書式は開始値..終了値となります。

❯ 1..3
╭───┬───╮
│ 0 │ 1 │
│ 1 │ 2 │
│ 2 │ 3 │
╰───┴───╯
❯ 1..<5
╭───┬───╮
│ 0 │ 1 │
│ 1 │ 2 │
│ 2 │ 3 │
│ 3 │ 4 │
╰───┴───╯

Binary

以下は2進、8進、16進表記の例です。

❯ 0b[1 1010] # Binary
❯ 0x[1F FF]  # Hexadecimal
❯ 0o[377]    # Octal

構造データ

List

リストは、データ値の順序付けられたシーケンスです。リストの構文は、JSON の配列に非常に似ています。ただし、Nushell で値を簡単に区別できる場合は、値を区切るのにコンマは必要ありません。空の要素は[]と表記します。リストが空であるかはis-emptyで確認できます。

❯ [sam fred george]
╭───┬────────╮
│ 0 │ sam    │
│ 1 │ fred   │
│ 2 │ george │
╰───┴────────╯

リストから値を取り出す場合は、変数名.index[6]の書式でアクセスできます。

❯ [sam fred george].1
fred

rangeコマンドを使うと、指定範囲内のデータをアクセスできます。

❯ [a b c d e f] | range 1..3
╭───┬───╮
│ 0 │ b │
│ 1 │ c │
│ 2 │ d │
╰───┴───╯

insertupdateに加えて、prependappendもあります。これらを使用すると、それぞれリストの先頭またはリストの末尾に挿入できます。

❯ let colors = [yellow green]
❯ let colors = ($colors | prepend red)
❯ let colors = ($colors | append purple)
❯ $colors 
╭───┬────────╮
│ 0 │ red    │
│ 1 │ yellow │
│ 2 │ green  │
│ 3 │ purple │
╰───┴────────╯

inおよびnot-in演算子は、値がリスト内にあるかどうかをテストするために使用されます。例えば:

❯ let colors = [red green blue]
❯ 'blue' in $colors # true
true
❯ 'yellow' in $colors # false
false
❯ 'gold' not-in $colors # true
true

anyコマンドは、リスト内のいずれかの項目が特定の条件に一致するかどうかを判別します。例えば:

❯ let colors = [red green blue]
❯ $colors | any ($it | str ends-with "e") # リストの要素の単語の最後が`e`で終わるものがあるか?
true
❯ let scores = [ 1 2 3]
❯ $scores | any $it > 7 # リストの要素の値が7を超えるものがあるか?
false

allコマンドは、リスト内のすべての項目が特定の条件に一致するかどうかを判断します。例えば:

❯ $colors | all ($it | str ends-with "e") # リストの全要素の単語の最後が`e`で終わるものがあるか?
false
❯ $scores | all $it > 7 # リストの全要素の値が7を超えるものがあるか?
false

flatten コマンドは、ネストされたリストの項目を最上位のリストに追加することにより、既存のリストから新しいリストを作成します。これは、任意の深さでネストされたリストを平坦化するために複数回呼び出すことができます。例えば:

❯ [1 [2 3] 4 [5 6]] | flatten # [1 2 3 4 5 6]
╭───┬───╮
│ 0 │ 1 │
│ 1 │ 2 │
│ 2 │ 3 │
│ 3 │ 4 │
│ 4 │ 5 │
│ 5 │ 6 │
╰───┴───╯
❯ [[1 2] [3 [4 5 [6 7 8]]]] | flatten | flatten | flatten # [1 2 3 4 5 6 7 8]
╭───┬───╮
│ 0 │ 1 │
│ 1 │ 2 │
│ 2 │ 3 │
│ 3 │ 4 │
│ 4 │ 5 │
│ 5 │ 6 │
│ 6 │ 7 │
│ 7 │ 8 │
╰───┴───╯

wrapコマンドは、リストをテーブルに変換します。各リストの値は、単一の列を持つ個別の行に変換されます。

❯ let zones = [UTC CET Europe/Moscow Asia/Yekaterinburg]
❯ $zones | wrap 'Zone' | upsert Time {|it| (date now | date to-timezone $it.Zone | date format '%Y.%m.%d %H:%M')}
╭───┬────────────────────┬──────────────────╮
│ # │        Zone        │       Time       │
├───┼────────────────────┼──────────────────┤
│ 1 │ UTC                │ 2022.12.03 03:01 │
│ 2 │ CET                │ 2022.12.03 04:01 │
│ 3 │ Europe/Moscow      │ 2022.12.03 06:01 │
│ 4 │ Asia/Yekaterinburg │ 2022.12.03 08:01 │
╰───┴────────────────────┴──────────────────╯

Record

レコードは、文字列キーをさまざまなデータ値に関連付けるキーと値のペアを保持します。レコードの構文は、JSON のオブジェクトに非常に似ています。ただし、Nushell で値を簡単に区別できる場合は、値を区切るのにコンマは必要ありません。

❯ {name: sam rank: 10}
╭──────┬─────╮
│ name │ sam │
│ rank │ 10  │
╰──────┴─────╯

構造化データのtomlファイルを開いた場合、自動でrecordに変換されます。

❯ open ~/.config/starship.toml | describe 
record

同様にrecordに変換するコマンドはdate to-record, from eml, from toml, from url, from xml, into recordがあります。

❯ date now | date to-record | describe
record<year: int, month: int, day: int, hour: int, minute: int, second: int, timezone: string>
❯ [1 2 3] | into record | describe
record<0: int, 1: int, 2: int>

なおrecordデータのkeyを使って、値を取り出す場合は、変数名.keyの書式でアクセスできます。

❯ date now | date to-record | $in.year
2022

Table

テーブルは Nushellのコアデータ構造です。コマンドを実行すると、それらの多くが出力としてテーブルを返すことがわかります。テーブルには行と列の両方があります。テーブルの例として、built-inコマンドのlsの出力はテーブルとなっています。

リストを作成する方法と同様に、独自のテーブルを作成できます。テーブルには値だけでなく列も含まれているため、列値の名前を渡します。

❯ [[column1, column2]; [Value1, Value2] [Value3, Value4]]
╭───┬─────────┬─────────╮
│ # │ column1 │ column2 │
├───┼─────────┼─────────┤
│ 1 │ Value1  │ Value2  │
│ 2 │ Value3  │ Value4  │
╰───┴─────────┴─────────╯

JSONに似た書式でtableデータが作成可能です。

❯ [{name: sam, rank: 10}, {name: bob, rank: 7}]
╭───┬──────┬──────╮
│ # │ name │ rank │
├───┼──────┼──────┤
│ 1 │ sam  │   10 │
│ 2 │ bob  │    7 │
╰───┴──────┴──────╯

getコマンドで行番号[7]ないし、カラム名でデータを取り出すことができます。

❯  [{x:12, y:5}, {x:3, y:6}] 
╭───┬────┬───╮
│ # │ x  │ y │
├───┼────┼───┤
│ 1 │ 12 │ 5 │
│ 2 │  3 │ 6 │
╰───┴────┴───╯
❯  [{x:12, y:5}, {x:3, y:6}] | get x
╭───┬────╮
│ 0 │ 12 │
│ 1 │  3 │
╰───┴────╯
❯  [{x:12, y:5}, {x:3, y:6}] | get 0
╭───┬────╮
│ x │ 12 │
│ y │ 5  │
╰───┴────╯

テーブルで行番号を使ってアクセスできます。

❯ [{langs:[Rust JS Python], releases:60}]
╭───┬────────────────┬──────────╮
│ # │     langs      │ releases │
├───┼────────────────┼──────────┤
│ 1 │ ╭───┬────────╮ │       60 │
│   │ │ 0 │ Rust   │ │          │
│   │ │ 1 │ JS     │ │          │
│   │ │ 2 │ Python │ │          │
│   │ ╰───┴────────╯ │          │
╰───┴────────────────┴──────────╯
❯ [{langs:[Rust JS Python], releases:60}].0
╭──────────┬────────────────╮
│          │ ╭───┬────────╮ │
│ langs    │ │ 0 │ Rust   │ │
│          │ │ 1 │ JS     │ │
│          │ │ 2 │ Python │ │
│          │ ╰───┴────────╯ │
│ releases │ 60             │
╰──────────┴────────────────╯
❯ [{langs:[Rust JS Python], releases:60}].0.langs
╭───┬────────╮
│ 0 │ Rust   │
│ 1 │ JS     │
│ 2 │ Python │
╰───┴────────╯
❯ [{langs:[Rust JS Python], releases:60}].0.langs.2
Python

ドット記法でカラム名でアクセスできます。なおselectコマンドでも同様にできます。getコマンドでもデータへアクセスできますが、得られるデータ形式はリスト型になります。

❯ [{x:12 y:5} {x:4 y:7} {x:2 y:2}].x
╭───┬────╮
│ 0 │ 12 │
│ 1 │  4 │
│ 2 │  2 │
╰───┴────╯

このようにドット記法でテーブルをアクセスしてセルを位置を特定するのをcell pathと呼びます。

sort-byコマンドを呼び出して、並べ替えに使用する列を指定することで、テーブルを並べ替えることができます。ファイルのサイズでテーブルを並べ替えは以下のとおりです。

❯ ls | sort-by size
╭────┬───────────────────────┬──────┬──────────┬─────────────╮
│  # │         name          │ type │   size   │  modified   │
├────┼───────────────────────┼──────┼──────────┼─────────────┤
│  1 │ README.release.txt    │ file │    124 B │ 3 weeks ago │
│  2 │ uninstall-all.sh      │ file │    374 B │ 3 weeks ago │
│  3 │ build.rs              │ file │    381 B │ 3 weeks ago │
│  4 │ build-all-maclin.sh   │ file │    594 B │ 3 weeks ago │
│  5 │ build-all.nu          │ file │    605 B │ 3 weeks ago │
│  6 │ build-all-windows.cmd │ file │    757 B │ 3 weeks ago │
│  7 │ install-all.sh        │ file │    848 B │ 3 weeks ago │
│  8 │ install-all.ps1       │ file │    955 B │ 3 weeks ago │
│  9 │ register-plugins.nu   │ file │   1.0 KB │ 3 weeks ago │
│ 10 │ LICENSE               │ file │   1.1 KB │ 3 weeks ago │
│ 11 │ rust-toolchain.toml   │ file │   1.1 KB │ 3 weeks ago │
│ 12 │ CONTRIBUTING.md       │ file │   3.1 KB │ 3 weeks ago │
│ 13 │ CODE_OF_CONDUCT.md    │ file │   3.4 KB │ 3 weeks ago │
│ 14 │ assets                │ dir  │   4.1 KB │ 3 weeks ago │
│ 15 │ crates                │ dir  │   4.1 KB │ 3 weeks ago │
│ 16 │ docker                │ dir  │   4.1 KB │ 3 weeks ago │
│ 17 │ docs                  │ dir  │   4.1 KB │ 3 weeks ago │
│ 18 │ images                │ dir  │   4.1 KB │ 3 weeks ago │
│ 19 │ pkg_mgrs              │ dir  │   4.1 KB │ 3 weeks ago │
│ 20 │ samples               │ dir  │   4.1 KB │ 3 weeks ago │
│ 21 │ src                   │ dir  │   4.1 KB │ 3 weeks ago │
│ 22 │ tests                 │ dir  │   4.1 KB │ 3 weeks ago │
│ 23 │ wix                   │ dir  │   4.1 KB │ 3 weeks ago │
│ 24 │ Cargo.toml            │ file │   4.2 KB │ 3 weeks ago │
│ 25 │ README.md             │ file │  13.1 KB │ 3 weeks ago │
│ 26 │ Cargo.lock            │ file │ 140.5 KB │ 3 weeks ago │
├────┼───────────────────────┼──────┼──────────┼─────────────┤
│  # │         name          │ type │   size   │  modified   │
╰────┴───────────────────────┴──────┴──────────┴─────────────╯

特定の列または特定の行を選択することで、テーブルからデータを選択できます。

❯ ls | select name size
╭────┬───────────────────────┬──────────╮
│  # │         name          │   size   │
├────┼───────────────────────┼──────────┤
│  1 │ CODE_OF_CONDUCT.md    │   3.4 KB │
│  2 │ CONTRIBUTING.md       │   3.1 KB │
│  3 │ Cargo.lock            │ 140.5 KB │
│  4 │ Cargo.toml            │   4.2 KB │
│  5 │ LICENSE               │   1.1 KB │
│  6 │ README.md             │  13.1 KB │
│  7 │ README.release.txt    │    124 B │
│  8 │ assets                │   4.1 KB │
│  9 │ build-all-maclin.sh   │    594 B │
│ 10 │ build-all-windows.cmd │    757 B │
│ 11 │ build-all.nu          │    605 B │
│ 12 │ build.rs              │    381 B │
│ 13 │ crates                │   4.1 KB │
│ 14 │ docker                │   4.1 KB │
│ 15 │ docs                  │   4.1 KB │
│ 16 │ images                │   4.1 KB │
│ 17 │ install-all.ps1       │    955 B │
│ 18 │ install-all.sh        │    848 B │
│ 19 │ pkg_mgrs              │   4.1 KB │
│ 20 │ register-plugins.nu   │   1.0 KB │
│ 21 │ rust-toolchain.toml   │   1.1 KB │
│ 22 │ samples               │   4.1 KB │
│ 23 │ src                   │   4.1 KB │
│ 24 │ tests                 │   4.1 KB │
│ 25 │ uninstall-all.sh      │    374 B │
│ 26 │ wix                   │   4.1 KB │
├────┼───────────────────────┼──────────┤
│  # │         name          │   size   │
╰────┴───────────────────────┴──────────╯

これは、必要なものにより焦点を当てた表を作成するのに役立ちます。次に、このディレクトリ内の最小の 5 つのファイルのみを調べたいとします。

❯ ls | sort-by size | first 5
╭───┬─────────────────────┬──────┬───────┬─────────────╮
│ # │        name         │ type │ size  │  modified   │
├───┼─────────────────────┼──────┼───────┼─────────────┤
│ 1 │ README.release.txt  │ file │ 124 B │ 3 weeks ago │
│ 2 │ uninstall-all.sh    │ file │ 374 B │ 3 weeks ago │
│ 3 │ build.rs            │ file │ 381 B │ 3 weeks ago │
│ 4 │ build-all-maclin.sh │ file │ 594 B │ 3 weeks ago │
│ 5 │ build-all.nu        │ file │ 605 B │ 3 weeks ago │
╰───┴─────────────────────┴──────┴───────┴─────────────╯

最初にテーブルをサイズで並べ替えて最小のファイルを取得し、次に最初の 5 行を使用してテーブルの最初の 5 行を返します。

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

❯ ls | sort-by size | first 5 | skip 2
╭───┬─────────────────────┬──────┬───────┬─────────────╮
│ # │        name         │ type │ size  │  modified   │
├───┼─────────────────────┼──────┼───────┼─────────────┤
│ 1 │ build.rs            │ file │ 381 B │ 3 weeks ago │
│ 2 │ build-all-maclin.sh │ file │ 594 B │ 3 weeks ago │
│ 3 │ build-all.nu        │ file │ 605 B │ 3 weeks ago │
╰───┴─────────────────────┴──────┴───────┴─────────────╯

気になる 3 行に絞り込みました。

データを選択するための他のいくつかのコマンドを見てみましょう。テーブルの行が数値である理由を疑問に思ったかもしれません。これは、単一の行に到達するための便利な方法として機能します。テーブルをファイル名でソートし、行番号を使用して select コマンドで行の 1 つを選択しましょう。

❯ ls | sort-by name
╭────┬───────────────────────┬──────┬──────────┬─────────────╮
│  # │         name          │ type │   size   │  modified   │
├────┼───────────────────────┼──────┼──────────┼─────────────┤
│  1 │ CODE_OF_CONDUCT.md    │ file │   3.4 KB │ 3 weeks ago │
│  3 │ Cargo.lock            │ file │ 140.5 KB │ 3 weeks ago │
│  4 │ Cargo.toml            │ file │   4.2 KB │ 3 weeks ago │
│  5 │ LICENSE               │ file │   1.1 KB │ 3 weeks ago │
│  6 │ README.md             │ file │  13.1 KB │ 3 weeks ago │
│  7 │ README.release.txt    │ file │    124 B │ 3 weeks ago │
│  8 │ assets                │ dir  │   4.1 KB │ 3 weeks ago │
│  9 │ build-all-maclin.sh   │ file │    594 B │ 3 weeks ago │
│ 10 │ build-all-windows.cmd │ file │    757 B │ 3 weeks ago │
│ 11 │ build-all.nu          │ file │    605 B │ 3 weeks ago │
│ 12 │ build.rs              │ file │    381 B │ 3 weeks ago │
│ 13 │ crates                │ dir  │   4.1 KB │ 3 weeks ago │
│ 14 │ docker                │ dir  │   4.1 KB │ 3 weeks ago │
│ 15 │ docs                  │ dir  │   4.1 KB │ 3 weeks ago │
│ 16 │ images                │ dir  │   4.1 KB │ 3 weeks ago │
│ 17 │ install-all.ps1       │ file │    955 B │ 3 weeks ago │
│ 18 │ install-all.sh        │ file │    848 B │ 3 weeks ago │
│ 19 │ pkg_mgrs              │ dir  │   4.1 KB │ 3 weeks ago │
│ 20 │ register-plugins.nu   │ file │   1.0 KB │ 3 weeks ago │
│ 21 │ rust-toolchain.toml   │ file │   1.1 KB │ 3 weeks ago │
│ 22 │ samples               │ dir  │   4.1 KB │ 3 weeks ago │
│ 23 │ src                   │ dir  │   4.1 KB │ 3 weeks ago │
│ 24 │ tests                 │ dir  │   4.1 KB │ 3 weeks ago │
│ 25 │ uninstall-all.sh      │ file │    374 B │ 3 weeks ago │
│ 26 │ wix                   │ dir  │   4.1 KB │ 3 weeks ago │
├────┼───────────────────────┼──────┼──────────┼─────────────┤
│  # │         name          │ type │   size   │  modified   │
╰────┴───────────────────────┴──────┴──────────┴─────────────╯
❯ ls | sort-by name | select 5
╭───┬───────────┬──────┬─────────┬─────────────╮
│ # │   name    │ type │  size   │  modified   │
├───┼───────────┼──────┼─────────┼─────────────┤
│ 1 │ README.md │ file │ 13.1 KB │ 3 weeks ago │
╰───┴───────────┴──────┴─────────┴─────────────╯

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

❯ ls | get name
╭────┬───────────────────────╮
│  0 │ CODE_OF_CONDUCT.md    │
│  1 │ CONTRIBUTING.md       │
│  2 │ Cargo.lock            │
│  3 │ Cargo.toml            │
│  4 │ LICENSE               │
│  5 │ README.md             │
│  6 │ README.release.txt    │
│  7 │ assets                │
│  8 │ build-all-maclin.sh   │
│  9 │ build-all-windows.cmd │
│ 10 │ build-all.nu          │
│ 11 │ build.rs              │
│ 12 │ crates                │
│ 13 │ docker                │
│ 14 │ docs                  │
│ 15 │ images                │
│ 16 │ install-all.ps1       │
│ 17 │ install-all.sh        │
│ 18 │ pkg_mgrs              │
│ 19 │ register-plugins.nu   │
│ 20 │ rust-toolchain.toml   │
│ 21 │ samples               │
│ 22 │ src                   │
│ 23 │ tests                 │
│ 24 │ uninstall-all.sh      │
│ 25 │ wix                   │
╰────┴───────────────────────╯

これで、各ファイル名の値が得られました。

これは前に見た select コマンドのように見えるかもしれないので、ここにも入れて 2 つを比較してみましょう。

❯ ls | select name
╭────┬───────────────────────╮
│  # │         name          │
├────┼───────────────────────┤
│  1 │ CODE_OF_CONDUCT.md    │
│  2 │ CONTRIBUTING.md       │
│  3 │ Cargo.lock            │
│  4 │ Cargo.toml            │
│  5 │ LICENSE               │
│  6 │ README.md             │
│  7 │ README.release.txt    │
│  8 │ assets                │
│  9 │ build-all-maclin.sh   │
│ 10 │ build-all-windows.cmd │
│ 11 │ build-all.nu          │
│ 12 │ build.rs              │
│ 13 │ crates                │
│ 14 │ docker                │
│ 15 │ docs                  │
│ 16 │ images                │
│ 17 │ install-all.ps1       │
│ 18 │ install-all.sh        │
│ 19 │ pkg_mgrs              │
│ 20 │ register-plugins.nu   │
│ 21 │ rust-toolchain.toml   │
│ 22 │ samples               │
│ 23 │ src                   │
│ 24 │ tests                 │
│ 25 │ uninstall-all.sh      │
│ 26 │ wix                   │
├────┼───────────────────────┤
│  # │         name          │
╰────┴───────────────────────╯

これらは非常によく似ています!明確にするために、これら 2 つのコマンドの違いを詳しく説明できるかどうか見てみましょう。

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

テーブルを見てこれらを区別する1つの方法は、列名が欠落していることです。これにより、これが操作できる値のリストになることがわかります。

getコマンドはさらに一歩進んで、テーブルのより深いデータへのパスを取ることができます。これにより、.jsonファイルに見られる構造など、より複雑なデータの操作が簡素化されます。

appendを使用して、同一の列名を持つテーブルを連結できます。

❯ let $first = [[a b]; [1 2]]
❯ $first
╭───┬───┬───╮
│ # │ a │ b │
├───┼───┼───┤
│ 1 │ 1 │ 2 │
╰───┴───┴───╯
❯ let $second = [[a b]; [3 4]]
❯ $second
╭───┬───┬───╮
│ # │ a │ b │
├───┼───┼───┤
│ 1 │ 3 │ 4 │
╰───┴───┴───╯
❯ $first | append $second
╭───┬───┬───╮
│ # │ a │ b │
├───┼───┼───┤
│ 1 │ 1 │ 2 │
│ 2 │ 3 │ 4 │
╰───┴───┴───╯

mergeコマンドを使用して、2 つ (またはそれ以上) のテーブルを一緒にマージできます。

❯ let $first = [[a b]; [1 2]]
❯ $first
╭───┬───┬───╮
│ # │ a │ b │
├───┼───┼───┤
│ 1 │ 1 │ 2 │
╰───┴───┴───╯
❯ let $second = [[c d]; [3 4]]
❯ $second
╭───┬───┬───╮
│ # │ c │ d │
├───┼───┼───┤
│ 1 │ 3 │ 4 │
╰───┴───┴───╯
❯ $first | merge $second 
╭───┬───┬───┬───┬───╮
│ # │ a │ b │ c │ d │
├───┼───┼───┼───┼───┤
│ 1 │ 1 │ 2 │ 3 │ 4 │
╰───┴───┴───┴───┴───╯

カラム名が重複する場合は、追加ではなく上書きになります。

❯ [[a b]; [1 2]] | merge [[a b]; [3 4]]
╭───┬───┬───╮
│ # │ a │ b │
├───┼───┼───┤
│ 1 │ 3 │ 4 │
╰───┴───┴───╯

または、reduceコマンドを使用してすべてのテーブルを動的にマージすることもできます。

❯ [$first $second $third] 
╭───┬───────────────╮
│ 0 │ ╭───┬───┬───╮ │
│   │ │ # │ a │ b │ │
│   │ ├───┼───┼───┤ │
│   │ │ 1 │ 1 │ 2 │ │
│   │ ╰───┴───┴───╯ │
│ 1 │ ╭───┬───┬───╮ │
│   │ │ # │ c │ d │ │
│   │ ├───┼───┼───┤ │
│   │ │ 1 │ 3 │ 4 │ │
│   │ ╰───┴───┴───╯ │
│ 2 │ ╭───┬───┬───╮ │
│   │ │ # │ e │ f │ │
│   │ ├───┼───┼───┤ │
│   │ │ 1 │ 5 │ 6 │ │
│   │ ╰───┴───┴───╯ │
╰───┴───────────────╯
❯ [$first $second $third] | reduce {|it, acc| $acc | merge  $it}
╭───┬───┬───┬───┬───┬───┬───╮
│ # │ a │ b │ c │ d │ e │ f │
├───┼───┼───┼───┼───┼───┼───┤
│ 1 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │
╰───┴───┴───┴───┴───┴───┴───╯

カラムデータの更新はupdateを使います。複数行ある場合は、すべてのカラム値を置き換えてしまうので、クロージャを使って書き換えます。

❯ [[a b]; [1 2] [a b]; [3 4]] | update a 4
╭───┬───┬───╮
│ # │ a │ b │
├───┼───┼───┤
│ 1 │ 4 │ 2 │
│ 2 │ 4 │ b │
╰───┴───┴───╯
❯ [[a b]; [1 2] [a b]; [3 4]] | update a {|row,index| if $index == 0 {$row.a} else {555}}
╭───┬─────┬───╮
│ # │  a  │ b │
├───┼─────┼───┤
│ 1 │   1 │ 2 │
│ 2 │ 555 │ b │
╰───┴─────┴───╯

moveを使用して、テーブル内の列を移動できます。たとえば、「name」列を ls から「size」列の後に移動したい場合は、次のようにします。

❯ ls | move name --after size
╭────┬──────┬──────────┬───────────────────────┬─────────────╮
│  # │ type │   size   │         name          │  modified   │
├────┼──────┼──────────┼───────────────────────┼─────────────┤
│  1 │ file │   3.4 KB │ CODE_OF_CONDUCT.md    │ 3 weeks ago │
│  2 │ file │   3.1 KB │ CONTRIBUTING.md       │ 3 weeks ago │
│  3 │ file │ 140.5 KB │ Cargo.lock            │ 3 weeks ago │
│  4 │ file │   4.2 KB │ Cargo.toml            │ 3 weeks ago │
│  5 │ file │   1.1 KB │ LICENSE               │ 3 weeks ago │
│  6 │ file │  13.1 KB │ README.md             │ 3 weeks ago │
│  7 │ file │    124 B │ README.release.txt    │ 3 weeks ago │
│  8 │ dir  │   4.1 KB │ assets                │ 3 weeks ago │
│  9 │ file │    594 B │ build-all-maclin.sh   │ 3 weeks ago │
│ 10 │ file │    757 B │ build-all-windows.cmd │ 3 weeks ago │
│ 11 │ file │    605 B │ build-all.nu          │ 3 weeks ago │
│ 12 │ file │    381 B │ build.rs              │ 3 weeks ago │
│ 13 │ dir  │   4.1 KB │ crates                │ 3 weeks ago │
│ 14 │ dir  │   4.1 KB │ docker                │ 3 weeks ago │
│ 15 │ dir  │   4.1 KB │ docs                  │ 3 weeks ago │
│ 16 │ dir  │   4.1 KB │ images                │ 3 weeks ago │
│ 17 │ file │    955 B │ install-all.ps1       │ 3 weeks ago │
│ 18 │ file │    848 B │ install-all.sh        │ 3 weeks ago │
│ 19 │ dir  │   4.1 KB │ pkg_mgrs              │ 3 weeks ago │
│ 20 │ file │   1.0 KB │ register-plugins.nu   │ 3 weeks ago │
│ 21 │ file │   1.1 KB │ rust-toolchain.toml   │ 3 weeks ago │
│ 22 │ dir  │   4.1 KB │ samples               │ 3 weeks ago │
│ 23 │ dir  │   4.1 KB │ src                   │ 3 weeks ago │
│ 24 │ dir  │   4.1 KB │ tests                 │ 3 weeks ago │
│ 25 │ file │    374 B │ uninstall-all.sh      │ 3 weeks ago │
│ 26 │ dir  │   4.1 KB │ wix                   │ 3 weeks ago │
├────┼──────┼──────────┼───────────────────────┼─────────────┤
│  # │ type │   size   │         name          │  modified   │
╰────┴──────┴──────────┴───────────────────────┴─────────────╯

rename コマンドを介して渡すことにより、テーブル内の列の名前を変更することもできます。ls を実行して列の名前を変更したい場合は、次の例を使用できます。

❯ ls | rename filename filetype filesize date
╭────┬───────────────────────┬──────────┬──────────┬─────────────╮
│  # │       filename        │ filetype │ filesize │    date     │
├────┼───────────────────────┼──────────┼──────────┼─────────────┤
│  1 │ CODE_OF_CONDUCT.md    │ file     │   3.4 KB │ 3 weeks ago │
│  2 │ CONTRIBUTING.md       │ file     │   3.1 KB │ 3 weeks ago │
│  3 │ Cargo.lock            │ file     │ 140.5 KB │ 3 weeks ago │
│  4 │ Cargo.toml            │ file     │   4.2 KB │ 3 weeks ago │
│  5 │ LICENSE               │ file     │   1.1 KB │ 3 weeks ago │
│  6 │ README.md             │ file     │  13.1 KB │ 3 weeks ago │
│  7 │ README.release.txt    │ file     │    124 B │ 3 weeks ago │
│  8 │ assets                │ dir      │   4.1 KB │ 3 weeks ago │
│  9 │ build-all-maclin.sh   │ file     │    594 B │ 3 weeks ago │
│ 10 │ build-all-windows.cmd │ file     │    757 B │ 3 weeks ago │
│ 11 │ build-all.nu          │ file     │    605 B │ 3 weeks ago │
│ 12 │ build.rs              │ file     │    381 B │ 3 weeks ago │
│ 13 │ crates                │ dir      │   4.1 KB │ 3 weeks ago │
│ 14 │ docker                │ dir      │   4.1 KB │ 3 weeks ago │
│ 15 │ docs                  │ dir      │   4.1 KB │ 3 weeks ago │
│ 16 │ images                │ dir      │   4.1 KB │ 3 weeks ago │
│ 17 │ install-all.ps1       │ file     │    955 B │ 3 weeks ago │
│ 18 │ install-all.sh        │ file     │    848 B │ 3 weeks ago │
│ 19 │ pkg_mgrs              │ dir      │   4.1 KB │ 3 weeks ago │
│ 20 │ register-plugins.nu   │ file     │   1.0 KB │ 3 weeks ago │
│ 21 │ rust-toolchain.toml   │ file     │   1.1 KB │ 3 weeks ago │
│ 22 │ samples               │ dir      │   4.1 KB │ 3 weeks ago │
│ 23 │ src                   │ dir      │   4.1 KB │ 3 weeks ago │
│ 24 │ tests                 │ dir      │   4.1 KB │ 3 weeks ago │
│ 25 │ uninstall-all.sh      │ file     │    374 B │ 3 weeks ago │
│ 26 │ wix                   │ dir      │   4.1 KB │ 3 weeks ago │
├────┼───────────────────────┼──────────┼──────────┼─────────────┤
│  # │       filename        │ filetype │ filesize │    date     │
╰────┴───────────────────────┴──────────┴──────────┴─────────────╯

Null

null は、値がないことと同じではありません!行の一部に穴が開いたテーブルが作成される可能性があります。この値にアクセスしようとしても null は生成されませんが、代わりにエラーが発生します。がnullのセルです。

❯ [{a:1 b:2} {b:1}]
╭───┬────┬───╮
│ # │ a  │ b │
├───┼────┼───┤
│ 1 │  1 │ 2 │
│ 2 │ ❎ │ 1 │
╰───┴────┴───╯
[{a:1 b:2} {b:1}].1.a
Error: nu::shell::column_not_found (link)

  × Cannot find column
   ╭─[entry #515:1:1]
 1 │ [{a:1 b:2} {b:1}].1.a
   ·            ──┬──    ┬
   ·              │      ╰── cannot find column 'a'
   ·              ╰── value originates here
   ╰────
脚注
  1. help into参照 ↩︎

  2. もともとクロージャはVer. 0.73まではブロックと呼ばれていたものです。 ↩︎

  3. 変数に格納したクロージャーとブロックはdo[3]などを使って実行できます。
    ↩︎

  4. 文字列補完 ↩︎

  5. NO_COLOR環境変数は無視されるようです ↩︎

  6. indexは0オリジンです ↩︎

  7. 行番号は0オリジンです ↩︎

Discussion