Nushell
安装 Nu !
快速开始
  • Nushell 之书
  • 命令参考列表
  • 实战指南
  • 语言参考指南
  • 贡献指南
博客
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
  • 한국어
GitHub
安装 Nu !
快速开始
  • Nushell 之书
  • 命令参考列表
  • 实战指南
  • 语言参考指南
  • 贡献指南
博客
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
  • 한국어
GitHub
  • 语言参考指南
  • 过滤器
    • each 和 par-each
    • 选择数据子集的过滤器
    • where 和 filter
    • 理解 get 和 select 的区别

理解 get 和 select 的区别

简而言之,get 从输入中取出值,而 select 保留输入的结构(记录仍是记录,表格仍是表格),只去掉你没有要求的部分。

get 取出值:指定单个键时返回单个值,指定多个键时返回列表。

{a: 1, b: 2, c: 3} | get b
# => 2
{a: 1, b: 2, c: 3} | get b c
# => ╭───┬───╮
# => │ 0 │ 2 │
# => │ 1 │ 3 │
# => ╰───┴───╯

select 保留 Nushell 的值,并返回按列名或键选中的记录。

{a: 1, b: 2, c: 3} | select b
# => ╭───┬───╮
# => │ b │ 2 │
# => ╰───┴───╯
{a: 1, b: 2, c: 3} | select b c
# => ╭───┬───╮
# => │ b │ 2 │
# => │ c │ 3 │
# => ╰───┴───╯

用于表格

下面的示例使用这张表格:

let t = [[name lang]; [nushell rust] [reedline rust] [vscode-ext typescript]]

对于一列,get 返回该列值的列表,而 select 返回只包含该列的表格:

$t | get name
# => ╭───┬────────────╮
# => │ 0 │ nushell    │
# => │ 1 │ reedline   │
# => │ 2 │ vscode-ext │
# => ╰───┴────────────╯
$t | select name
# => ╭───┬────────────╮
# => │ # │    name    │
# => ├───┼────────────┤
# => │ 0 │ nushell    │
# => │ 1 │ reedline   │
# => │ 2 │ vscode-ext │
# => ╰───┴────────────╯

对于行索引,get 以记录形式返回该行,而 select 返回只包含该行的表格:

$t | get 1
# => ╭──────┬──────────╮
# => │ name │ reedline │
# => │ lang │ rust     │
# => ╰──────┴──────────╯
$t | select 1
# => ╭───┬──────────┬──────╮
# => │ # │   name   │ lang │
# => ├───┼──────────┼──────┤
# => │ 0 │ reedline │ rust │
# => ╰───┴──────────┴──────╯

嵌套数据

两个命令都接受单元格路径。get 沿着路径走,返回路径末端的值。select 则为该路径保留一列, 并以整个路径命名:

{a: {b: 1}} | get a.b
# => 1
{a: {b: 1}} | select a.b
# => ╭─────┬───╮
# => │ a.b │ 1 │
# => ╰─────┴───╯

缺失数据

当列不存在时,两个命令都会报错。在单元格路径成员后加上 ?,或传入 --optional(-o), 可以让每个成员都变成可选的。此时 get 返回 null,而 select 返回一个空单元格:

{a: 1} | get -o z | describe
# => nothing
{a: 1} | select -o z
# => ╭───┬──╮
# => │ z │  │
# => ╰───┴──╯

两个命令也都接受 --ignore-case,用于以不区分大小写的方式匹配列名。

另见:选择数据子集的过滤器,以及《Nushell 之书》中的 使用 get 和 select。

在GitHub上编辑此页面
Contributors: NotTheDr01ds, Kieron Wilkinson, qaz, fdncred, Jianjun Wang, passionworkeer
Prev
where 和 filter