Nushellのデータ型について
データ型
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
次はdate
とduration
間の演算の例です。
❯ 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 │
╰───┴───╯
insert
とupdate
に加えて、prepend
とappend
もあります。これらを使用すると、それぞれリストの先頭またはリストの末尾に挿入できます。
❯ 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
╰────
Discussion