Saltar al contenido principal

Pipelines declarativos en Nushell

Metadatos de la lección

Autoría:
Ignacio Slater-Muñoz
Última actualización:
27 de marzo de 2026

Cambios recientes:

  • 8880728 · 27 de marzo de 2026 · ✨ feat(notes): add abstract slots and Python structured-output lesson ( GitLab / GitHub )
  • a6f279d · 27 de marzo de 2026 · 📝 feat(pipelines): expand the Nushell lesson examples ( GitLab / GitHub )
  • 67ea712 · 27 de marzo de 2026 · ✨ feat(bibliography): add catalog-backed video references ( GitLab / GitHub )

Encuentra el código de la lección:

Abstract

Nushell y PowerShell comparten la idea de expresar trabajo como una secuencia de transformaciones, pero ponen el foco en modelos distintos de dato. En Nushell, el pipeline suele hacer más visible la forma estructurada de records, listas y tablas.

En esta lección compararemos ambos enfoques y veremos operaciones nucleares como filtrar, proyectar, ordenar y limitar. El objetivo no es decidir cuál herramienta es «mejor» , sino entender en qué escenarios la simplicidad declarativa de Nushell resulta especialmente conveniente.

El pipeline en Nushell: datos con forma visible

Pipeline declarativo en Nushell

En Nushell, el pipeline conecta comandos que transforman datos estructurados, como records, listas y tablas. Igual que en PowerShell, la intención se expresa como una secuencia de transformaciones, pero aquí la forma del dato suele mantenerse más visible durante el flujo.

Por eso Nushell resulta especialmente cómodo cuando el problema se parece a una colección homogénea de datos: archivos, filas de CSV, resultados JSON o respuestas de API con estructura relativamente estable.

En ese escenario, inspeccionar columnas, seleccionar campos, filtrar filas y reformatear resultados suele ser más directo, porque la forma del dato se mantiene explícita durante el pipeline.

Trade-off práctico: simplicidad vs generalidad

PowerShell también puede usarse cuando lo que importa es la forma del dato, pero su paradigma de orientación a objetos (OOP) más completo permite además asociar comportamiento y funcionalidades a los objetos.

Nushell prioriza un modelo más simple y declarativo, centrado en transformar estructura visible. Esa simplicidad acelera muchos flujos tabulares, con el costo de cubrir menos escenarios donde el comportamiento del objeto es parte central del problema.

Tip

Si tu problema es principalmente transformar datos homogéneos, Nushell suele ser una opción más directa; si necesitas explotar comportamiento de objetos y ecosistema .NET, PowerShell suele ser más natural.

Operaciones nucleares del pipeline

Equivalencias pedagógicas útiles

Precaución

Estas equivalencias son útiles para orientarte, pero no implican que ambos comandos tengan exactamente el mismo alcance ni las mismas convenciones de uso.
  • Filtrar: where ocupa el lugar conceptual de Where-Object .
  • Proyectar columnas: select deja visibles solo las columnas relevantes y conserva la estructura tabular.
  • Extraer campos: get accede al contenido de una columna, campo o ruta dentro del dato. En muchos casos cumple un papel parecido al de expandir una propiedad en PowerShell.
  • Ordenar y limitar: sort-by y first permiten expresar con claridad el patrón ordenar y luego quedarse con una parte.
  • Transformar: update e insert sirven para modificar o agregar columnas, mientras que each permite transformar cada elemento de forma más general.
  • Renombrar columnas: rename ayuda a adaptar la forma del dato cuando necesitas alinear nombres entre etapas del pipeline.

Cuándo conviene cada enfoque

  • Nushell suele destacar cuando la tarea es transformar datos con forma homogénea de principio a fin.
  • PowerShell suele ser más natural cuando, además de forma, necesitas aprovechar objetos con comportamiento y ecosistemas amplios de cmdlets y bibliotecas.

Un pipeline básico en Nushell

Filtrar, proyectar, ordenar y limitar en Nushell. 1
open companions.json |
    where on_the_quest |
    select name kind role |
    sort-by name |
    first 10
El pipeline mantiene datos estructurados de principio a fin, sin pasar por texto intermedio cuando la entrada ya tiene una forma estable.
Output
╭───┬─────────┬────────┬─────────╮
│ # │  name   │  kind  │  role   │
├───┼─────────┼────────┼─────────┤
│ 0 │ Balin   │ dwarf  │ warrior │
│ 1 │ Bilbo   │ hobbit │ burglar │
│ 2 │ Gandalf │ wizard │ guide   │
│ 3 │ Thorin  │ dwarf  │ leader  │
╰───┴─────────┴────────┴─────────╯

Detalles clave

  • open deserializa automáticamente formatos como JSON y entrega una estructura ya navegable.
  • where on_the_quest expresa el filtro directamente sobre la columna, sin bloque adicional; la condición se lee más cerca de los datos que transforma.
  • select deja visibles solo las columnas relevantes, manteniendo la estructura tabular.
  • sort-by name ordena la tabla según la columna indicada antes de limitar los resultados.
  • first limita resultados al final, después de filtrar, proyectar y ordenar.

Variaciones sobre el mismo dataset

Nota breve sobre bloques y “lambdas”

Cuando encuentres expresiones como each {|item| $item } o update role {|row| $row }, conviene leerlas como bloques parametrizados. Si vienes de otros lenguajes, cumplen un papel parecido al de una lambda: reciben un valor, lo nombran y producen un resultado.

La sintaxis general es {|param| body }. Entre las barras verticales declaras el nombre del parámetro y, dentro del cuerpo, accedes a ese valor con $param o a sus campos con expresiones como $param.name.

Una ventaja de Nushell es que pequeñas variaciones sobre el mismo dataset se traducen en cambios pequeños y legibles dentro del pipeline. La estructura base se conserva y puedes decidir si filtrar, resumir, ordenar, transformar cada fila o enriquecer la tabla.

Quedarse solo con quienes siguen en la quest
open companions.json | where on_the_quest
Esta variación corresponde a la parte más simple del flujo: partir desde la tabla y filtrar los registros relevantes.
Construir una tabla compacta para revisar rápido la compañía
open companions.json |
    where on_the_quest |
    select name kind role |
    sort-by name |
    first 10
Aquí reaparece el flujo base completo: filtrar, proyectar, ordenar y limitar sin perder la estructura tabular.
Transformar records en encabezados breves con each
open companions.json |
    where on_the_quest |
    sort-by name |
    each {|companion| $"($companion.name) the ($companion.kind)" }
Aquí each cambia la forma del flujo: de una tabla de records a una lista de valores derivados.
Output
╭───┬────────────────────╮
│ 0 │ Balin the dwarf    │
│ 1 │ Bilbo the hobbit   │
│ 2 │ Gandalf the wizard │
│ 3 │ Thorin the dwarf   │
╰───┴────────────────────╯
Extraer una columna concreta con get
open companions.json |
    where on_the_quest |
    sort-by name |
    get name
Esta variación prioriza acceso directo a una columna y devuelve una lista de valores simples.
Output
╭───┬─────────╮
│ 0 │ Balin   │
│ 1 │ Bilbo   │
│ 2 │ Gandalf │
│ 3 │ Thorin  │
╰───┴─────────╯
Renombrar columnas para adaptar la salida con rename
open companions.json |
    where on_the_quest |
    sort-by name |
    select name role |
    rename companion quest_role
Aquí no cambias el contenido: cambias la forma nominal de la tabla para alinear nombres con la siguiente etapa del pipeline.
Output
╭───┬───────────┬────────────╮
│ # │ companion │ quest_role │
├───┼───────────┼────────────┤
│ 0 │ Balin     │ warrior    │
│ 1 │ Bilbo     │ burglar    │
│ 2 │ Gandalf   │ guide      │
│ 3 │ Thorin    │ leader     │
╰───┴───────────┴────────────╯
Enriquecer cada fila con update e insert
open companions.json |
    where on_the_quest |
    update role {|companion| $companion.role | str upcase } |
    insert summary {|companion| $"($companion.name) from ($companion.homeland)" } |
    sort-by name |
    select name kind role summary
El pipeline sigue siendo estructurado, pero ahora no solo selecciona: también rehace contenido, agrega una columna derivada y mantiene resultados ordenados.
Output
╭───┬─────────┬────────┬─────────┬──────────────────────╮
│ # │  name   │  kind  │  role   │       summary        │
├───┼─────────┼────────┼─────────┼──────────────────────┤
│ 0 │ Bilbo   │ hobbit │ BURGLAR │ Bilbo from The Shire │
│ 1 │ Gandalf │ wizard │ GUIDE   │ Gandalf from Valinor │
│ 2 │ Thorin  │ dwarf  │ LEADER  │ Thorin from Erebor   │
│ 3 │ Balin   │ dwarf  │ WARRIOR │ Balin from Erebor    │
╰───┴─────────┴────────┴─────────┴──────────────────────╯

Conclusiones

Nushell ofrece un pipeline especialmente legible cuando el trabajo consiste en transformar datos con estructura homogénea. En esos casos, operaciones como filtrar, proyectar, ordenar o limitar se combinan con naturalidad con otras como transformar cada elemento o enriquecer columnas, manteniendo la forma del dato visible durante todo el flujo.

Esa claridad no reemplaza a PowerShell en todos los escenarios, pero sí muestra un trade-off importante: Nushell simplifica muchos procesos tabulares precisamente porque privilegia un modelo más declarativo y menos centrado en objetos con comportamiento. Cuando la tarea consiste en leer una tabla, ajustarla y producir otra salida estructurada, esa elección suele traducirse en menos fricción para quien mantiene el script.

Puntos clave

  • Nushell destaca cuando la estructura del dato permanece visible y estable de principio a fin.
  • Su pipeline favorece transformaciones pequeñas y legibles sobre records, listas y tablas, incluso cuando cambias de filtrar a resumir o derivar nuevas salidas.
  • Comandos como each, update e insert ayudan a transformar o enriquecer datos sin romper el flujo declarativo.
  • El trade-off entre simplicidad declarativa (Nushell) y mayor generalidad orientada a objetos (PowerShell) guía qué herramienta resulta más natural en cada tarea.

¿Qué nos llevamos?

Al diseñar scripts o bibliotecas pequeñas, no basta con preguntarse qué herramienta “puede” resolver el problema. También conviene pensar qué modelo de dato deja más clara la intención del flujo y reduce mejor la fricción para leer, transformar y reutilizar resultados.

Desde esa perspectiva, Nushell resulta especialmente atractivo cuando la tarea se parece a una cadena de transformaciones sobre datos visibles y reutilizables. La próxima lección toma esa base y avanza hacia pipeline-awareness: diseñar comandos que participen de forma natural en flujos encadenados y respeten la forma de los datos de entrada y salida.

¿Con ganas de más?

Notas

  1. Ejemplo inspirado en The Hobbit de J.R.R. Tolkien. Volver