Nushell
문서
쿡북
블로그
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
  • 한국어
GitHub
문서
쿡북
블로그
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
  • 한국어
GitHub
  • 소개
  • 설치하기
    • 기본 셸
  • 시작하기
    • 빠른 둘러보기
    • 시스템 이동
    • 누셸 방식으로 생각하기
    • 누셸 치트 시트
  • Nu 기본
    • 데이터 유형
    • 데이터 로드
    • 파이프라인
    • 문자열 작업
    • 목록 작업
    • 레코드 작업
    • 테이블 작업
    • 구조화된 데이터 탐색 및 액세스
    • 특수 변수
  • Nu에서 프로그래밍하기
    • 사용자 지정 명령
    • 별칭
    • 연산자
    • 변수
    • 제어 흐름
    • 스크립트
    • 모듈
      • 모듈 사용하기
      • 모듈 만들기
    • 오버레이
    • 정렬
    • 누셸 코드 테스트
    • 모범 사례
  • 셸로서의 Nu
    • 구성
    • 환경
    • 표준 출력, 표준 오류 및 종료 코드
    • 시스템(외부) 명령 실행
    • 타사 프롬프트 구성 방법
    • 디렉터리 스택
    • Reedline, Nu의 줄 편집기
    • 사용자 지정 완성
    • 외부 명령
    • Nu의 색상 지정 및 테마 설정
    • 후크
    • 백그라운드 작업
  • Nu로 전환하기
    • Bash에서 오신 분들을 위해
    • CMD.EXE에서 오신 분들을 위해
    • 다른 셸 및 도메인 특정 언어의 Nu 맵
    • 명령형 언어의 Nu 맵
    • 함수형 언어의 Nu 맵
    • 누셸 연산자 맵
  • 디자인 노트
    • 누셸 코드가 실행되는 방법
  • (약간)고급 사용법
    • 표준 라이브러리 (미리보기)
    • 데이터프레임
    • 메타데이터
    • 나만의 오류 만들기
    • 병렬 처리
    • 플러그인
    • explore

구조화된 데이터 탐색 및 액세스

누셸의 구조화된 데이터에 대한 강력한 지원을 고려할 때, 더 일반적인 작업 중 일부는 해당 데이터를 탐색하고 액세스하는 것과 관련이 있습니다.

이 섹션의 색인

  • 배경 및 정의
  • 셀 경로
    • 레코드 사용
    • 목록 사용
    • 테이블 사용
      • 샘플 데이터
      • 예제 - 테이블 행 액세스
      • 예제 - 테이블 열 액세스
    • 중첩된 데이터 사용
  • get 및 select 사용
    • 예제 - 테이블 행과 함께 get 대 select
    • 예제 - 여러 행과 열이 있는 select
  • 선택적 연산자를 사용하여 누락된 데이터 처리](#the-optional-operator)
  • 공백이 있는 키/열 이름
  • 구조화된 데이터 탐색을 위한 기타 명령

배경

아래 예제 및 설명을 위해 구조화된 데이터에 대한 몇 가지 정의를 염두에 두십시오.

  • 목록: 목록에는 모든 유형의 0개 이상의 값 시리즈가 포함됩니다. 값이 0개인 목록을 "빈 목록"이라고 합니다.
  • 레코드: 레코드에는 0개 이상의 명명된 키와 해당 값 쌍이 포함됩니다. 레코드 값의 데이터는 모든 유형일 수 있습니다. 키-값 쌍이 0개인 레코드를 "빈 레코드"라고 합니다.
  • 중첩된 데이터: 목록, 레코드 또는 테이블에 포함된 값은 기본 유형이거나 구조화된 데이터 자체일 수 있습니다. 즉, 데이터는 여러 수준과 여러 형태로 중첩될 수 있습니다.
    • 목록 값에는 테이블, 레코드 및 다른 목록도 포함될 수 있습니다.
      • 테이블: 테이블은 레코드 목록입니다.
    • 레코드 값에는 테이블, 목록 및 다른 레코드가 포함될 수 있습니다.
      • 즉, 테이블의 레코드에는 중첩된 테이블, 목록 및 다른 레코드도 포함될 수 있습니다.

팁

테이블은 레코드 목록이므로 목록에서 작동하는 모든 명령이나 구문은 테이블에서도 작동합니다. 그 반대는 반드시 사실이 아닙니다. 테이블에서는 작동하지만 목록에서는 작동하지 않는 일부 명령과 구문이 있습니다.

셀 경로

셀 경로는 구조화된 데이터 내부의 값에 액세스하는 주요 방법입니다. 이 경로는 열에 이름이 있고 행에 번호가 있는 스프레드시트와 유사한 개념을 기반으로 합니다. 셀 경로 이름과 인덱스는 점으로 구분됩니다.

레코드

레코드의 경우 셀 경로는 문자열인 키의 이름을 지정합니다.

예제 - 레코드 값 액세스:

let my_record = {
    a: 5
    b: 42
  }
$my_record.b + 5
# => 47

목록

목록의 경우 셀 경로는 목록에서 값의 위치(인덱스)를 지정합니다. 이것은 정수입니다.

예제 - 목록 값 액세스:

목록 인덱스는 0부터 시작한다는 것을 기억하십시오.

let scoobies_list = [ Velma Fred Daphne Shaggy Scooby ]
$scoobies_list.2
# => Daphne

테이블

  • 열에 액세스하려면 셀 경로가 문자열인 열의 이름을 사용합니다.
  • 행에 액세스하려면 정수인 행의 인덱스 번호를 사용합니다.
  • 단일 셀에 액세스하려면 열 이름과 행 인덱스를 조합하여 사용합니다.

다음 몇 가지 예제에서는 다음 테이블을 사용합니다.

let data = [
    [date                        temps                                   condition      ];
    [2022-02-01T14:30:00+05:00,  [38.24, 38.50, 37.99, 37.98, 39.10],   'sunny'       ],
    [2022-02-02T14:30:00+05:00,  [35.24, 35.94, 34.91, 35.24, 36.65],   'sunny'       ],
    [2022-02-03T14:30:00+05:00,  [35.17, 36.67, 34.42, 35.76, 36.52],   'cloudy'      ],
    [2022-02-04T14:30:00+05:00,  [39.24, 40.94, 39.21, 38.99, 38.80],   'rain'        ]
]
이 데이터의 시각적 표현을 보려면 확장하십시오.
╭───┬─────────────┬───────────────┬───────────╮
│ # │    date     │     temps     │ condition │
├───┼─────────────┼───────────────┼───────────┤
│ 0 │ 2 years ago │ ╭───┬───────╮ │ sunny     │
│   │             │ │ 0 │ 38.24 │ │           │
│   │             │ │ 1 │ 38.50 │ │           │
│   │             │ │ 2 │ 37.99 │ │           │
│   │             │ │ 3 │ 37.98 │ │           │
│   │             │ │ 4 │ 39.10 │ │           │
│   │             │ ╰───┴───────╯ │           │
│ 1 │ 2 years ago │ ╭───┬───────╮ │ sunny     │
│   │             │ │ 0 │ 35.24 │ │           │
│   │             │ │ 1 │ 35.94 │ │           │
│   │             │ │ 2 │ 34.91 │ │           │
│   │             │ │ 3 │ 35.24 │ │           │
│   │             │ │ 4 │ 36.65 │ │           │
│   │             │ ╰───┴───────╯ │           │
│ 2 │ 2 years ago │ ╭───┬───────╮ │ cloudy    │
│   │             │ │ 0 │ 35.17 │ │           │
│   │             │ │ 1 │ 36.67 │ │           │
│   │             │ │ 2 │ 34.42 │ │           │
│   │             │ │ 3 │ 35.76 │ │           │
│   │             │ │ 4 │ 36.52 │ │           │
│   │             │ ╰───┴───────╯ │           │
│ 3 │ 2 years ago │ ╭───┬───────╮ │ rain      │
│   │             │ │ 0 │ 39.24 │ │           │
│   │             │ │ 1 │ 40.94 │ │           │
│   │             │ │ 2 │ 39.21 │ │           │
│   │             │ │ 3 │ 38.99 │ │           │
│   │             │ │ 4 │ 38.80 │ │           │
│   │             │ ╰───┴───────╯ │           │
╰───┴─────────────┴───────────────┴───────────╯

이것은 세 개의 열이 있는 테이블 형식의 날씨 데이터를 나타냅니다.

  1. date: 각 날짜에 대한 누셸 date
  2. temps: 해당 지역의 여러 기상 관측소에서 측정한 5개의 float 값으로 구성된 누셸 list
  3. conditions: 해당 지역의 각 날짜 날씨 상태에 대한 누셸 string

예제 - 테이블 행 액세스(레코드)

두 번째 날짜의 데이터를 레코드로 액세스합니다.

$data.1
# => ╭───────────┬───────────────╮
# => │ date      │ 2 years ago   │
# => │           │ ╭───┬───────╮ │
# => │ temps     │ │ 0 │ 35.24 │ │
# => │           │ │ 1 │ 35.94 │ │
# => │           │ │ 2 │ 34.91 │ │
# => │           │ │ 3 │ 35.24 │ │
# => │           │ │ 4 │ 36.65 │ │
# => │           │ ╰───┴───────╯ │
# => │ condition │ sunny         │
# => ╰───────────┴───────────────╯

예제 - 테이블 열 액세스(목록)

$data.condition
# => ╭───┬────────╮
# => │ 0 │ sunny  │
# => │ 1 │ sunny  │
# => │ 2 │ cloudy │
# => │ 3 │ rain   │
# => ╰───┴────────╯

예제 - 테이블 셀 액세스(값)

네 번째 날의 상태:

$data.condition.3
# => rain

중첩된 데이터

데이터는 중첩될 수 있으므로 셀 경로는 여러 이름이나 인덱스에 대한 참조를 포함할 수 있습니다.

예제 - 중첩된 테이블 데이터 액세스

세 번째 날의 두 번째 기상 관측소에서 온도를 얻으려면:

$data.temps.2.1
# => 36.67

첫 번째 인덱스 2는 세 번째 날에 액세스하고, 다음 인덱스 1은 두 번째 기상 관측소의 온도 측정값에 액세스합니다.

get 및 select 사용

위에서 사용된 셀 경로 리터럴 구문 외에도 누셸은 셀 경로를 사용하는 몇 가지 명령도 제공합니다. 이 중 가장 중요한 것은 다음과 같습니다.

  • get은 셀 경로 리터럴을 사용하는 것과 동일하지만 변수 이름과 표현식을 지원합니다. 위 셀 경로 예제와 마찬가지로 get은 셀 경로로 표시된 값을 반환합니다.
  • select는 미묘하지만 결정적으로 다릅니다. 값만 반환하는 대신 지정된 데이터 구조 자체를 반환합니다.
    • 테이블에서 select를 사용하면 같거나 작은 크기의 테이블이 반환됩니다.
    • 목록에서 select를 사용하면 같거나 작은 크기의 목록이 반환됩니다.
    • 레코드에서 select를 사용하면 같거나 작은 크기의 레코드가 반환됩니다.

위의 샘플 테이블을 계속 사용합니다.

예제 - get 대 select 테이블 행

$data | get 1
# => ╭───────────┬───────────────╮
# => │ date      │ 2 years ago   │
# => │           │ ╭───┬───────╮ │
# => │ temps     │ │ 0 │ 35.24 │ │
# => │           │ │ 1 │ 35.94 │ │
# => │           │ │ 2 │ 34.91 │ │
# => │           │ │ 3 │ 35.24 │ │
# => │           │ │ 4 │ 36.65 │ │
# => │           │ ╰───┴───────╯ │
# => │ condition │ sunny         │
# => ╰───────────┴───────────────╯

$data | select 1
# => ╭───┬─────────────┬───────────────┬───────────╮
# => │ # │    date     │     temps     │ condition │
# => ├───┼─────────────┼───────────────┼───────────┤
# => │ 0 │ 2 years ago │ ╭───┬───────╮ │ sunny     │
# => │   │             │ │ 0 │ 35.24 │ │           │
# => │   │             │ │ 1 │ 35.94 │ │           │
# => │   │             │ │ 2 │ 34.91 │ │           │
# => │   │             │ │ 3 │ 35.24 │ │           │
# => │   │             │ │ 4 │ 36.65 │ │           │
# => │   │             │ ╰───┴───────╯ │           │
# => ╰───┴─────────────┴───────────────┴───────────╯

다음을 확인하십시오.

  • get은 위의 $data.1 예제와 동일한 레코드를 반환합니다.
  • select는 열 이름과 행 인덱스를 포함하여 새로운 단일 행 테이블을 반환합니다.

팁

select에서 반환된 테이블의 행 인덱스는 원본 테이블의 행 인덱스와 동일하지 않습니다. 새 테이블에는 자체 0 기반 인덱스가 있습니다.

원본 인덱스를 얻으려면 enumerate 명령을 사용할 수 있습니다. 예시:

$data | enumerate | select 1

예제 - 여러 행과 열이 있는 select

select가 새 테이블을 생성하므로 여러 열 이름, 행 인덱스 또는 둘 다를 지정할 수 있습니다. 이 예제는 첫 번째 및 두 번째 행의 날짜 및 상태 열을 포함하는 새 테이블을 만듭니다.

$data | select date condition 0 1
# => ╭───┬─────────────┬───────────╮
# => │ # │    date     │ condition │
# => ├───┼─────────────┼───────────┤
# => │ 0 │ 2 years ago │ sunny     │
# => │ 1 │ 2 years ago │ sunny     │
# => ╰───┴─────────────┴───────────╯

공백이 있는 키/열 이름

키 이름이나 열 이름에 공백이나 다른 문자가 포함되어 있어 일반 단어 문자열로 액세스할 수 없는 경우 키 이름을 따옴표로 묶을 수 있습니다.

예시:

let record_example = {
    "key x":12
    "key y":4
  }
$record_example."key x"
# => 12

# 또는
$record_example | get "key x"
# => 12

키 이름이 숫자 값과 혼동될 수 있는 경우에도 따옴표가 필요합니다.

예시:

let record_example = {
  "1": foo
  "2": baz
  "3": far
}

$record_example."1"
# =>   foo

이 경우 키 이름을 행 인덱스와 혼동하지 마십시오. 여기서 첫 번째 항목은 키 이름 1(문자열)에 _할당_됩니다. transpose 명령을 사용하여 테이블로 변환하면 키 1(문자열)은 행 인덱스 0(정수)에 있습니다.

누락된 데이터 처리

선택적 연산자

기본적으로 셀 경로 액세스는 요청된 행이나 열에 액세스할 수 없는 경우 실패합니다. 이러한 오류를 억제하려면 셀 경로 멤버에 ?를 추가하여 선택적으로 표시할 수 있습니다.

예제 - 선택적 연산자

위의 임시 데이터 사용:

let cp: cell-path = $.temps?.1 # temps 열에서 두 번째 위치만 가져옵니다.

# 웁스, temps 열을 제거했습니다.
$data | reject temps | get $cp

기본적으로 누락된 셀은 선택적 연산자를 통해 액세스할 때 null로 대체됩니다.

누락되거나 null인 데이터에 대한 default 할당

default 명령을 사용하여 누락되거나 null인 열 결과에 기본값을 적용할 수 있습니다.

let missing_value = [{a:1 b:2} {b:1}]
$missing_value
# => ╭───┬────┬───╮
# => │ # │ a  │ b │
# => ├───┼────┼───┤
# => │ 0 │  1 │ 2 │
# => │ 1 │ ❎ │ 1 │
# => ╰───┴────┴───╯

let with_default_value = ($missing_value | default 'n/a' a)
$with_default_value
# => ╭───┬─────┬───╮
# => │ # │  a  │ b │
# => ├───┼─────┼───┤
# => │ 0 │   1 │ 2 │
# => │ 1 │ n/a │ 1 │
# => ╰───┴─────┴───╯

$with_default_value.1.a
# => n/a

구조화된 데이터 액세스를 위한 기타 명령

  • reject는 select의 반대이며 지정된 행과 열을 제거합니다.
  • range는 range 유형을 사용하여 선택할 목록 또는 테이블의 행을 지정합니다.
GitHub에서 수정하기
Contributors: Taeyoon Kim, ImgBotApp, google-labs-jules[bot], deepthought
Prev
테이블 작업
Next
특수 변수