jq
매뉴얼 페이지 에서 --stream
옵션은 다음과 같습니다.
스트리밍 방식으로 입력, 출력 경로 및 리프 값(스칼라 및 빈 배열 또는 빈 객체)의 배열을 구문 분석합니다. 예를 들어
"a"
는 ,[[],"a"]
, , 및[[],"a",["b"]]
가 됩니다 .[[0],[]]
[[1],"a"]
[[1,0],"b"]
"경로 및 리프 값 배열"의 의미와 입력 표현이 다음으로 변환되는 이유를 알고 싶습니다.
"a" -> [[],"a"]
그리고
[[],"a",["b"]] -> [[0],[]] , [[1],"a"] , [[1,0],"b"]
나는 목록 표현과 같은 트리를 검토해 왔지만 유사하지 않습니다.
답변1
jq
이는 버전 1.6에 유효합니다.
스트리밍 모드에서는 입력의 데이터를 인코딩하는 일련의 배열을 얻게 됩니다. 각 배열에는 인코딩 경로 배열과 해당 경로의 값이 포함되어 있습니다(이를 "리프 값"이라고 부릅니다). 스트림에서 객체나 배열의 종료를 알리기 위해 값이 없는 배열이 내보내집니다.
예를 들어 JSON 개체는 {"key":"value"}
두 개의 배열로 스트리밍됩니다.
[["key"],"value"]
[["key"]]
첫 번째 스트림 배열은 경로와 값으로 구성됩니다. 경로는 ["key"]
키가 최상위 키인 것처럼 작동합니다 . 이 경로의 값은 입니다 "value"
.
두 번째 배열에는 경로만 있고 값은 없으며 이 스트림 객체의 끝을 나타냅니다(출력 스트림에는 더 이상 이 객체에 대한 키가 없습니다).
다른 예시:
복합 객체
{
"array": [
1,
2,
{
"hello": "world"
}
]
}
다음과 같이 스트리밍됩니다.
[["array",0],1]
[["array",1],2]
[["array",2,"hello"],"world"]
[["array",2,"hello"]]
[["array",2]]
[["array"]]
["array",0]
첫 번째 배열 에는 최상위 키 값인 배열의 첫 번째 요소인 path 가 포함됩니다 array
. 이 경로의 값은 입니다 1
.
두 번째 배열에는 경로 ["array",1]
(즉, 동일한 배열의 두 번째 요소)와 값이 포함됩니다 2
.
세 번째 배열에는 paths가 포함됩니다 ["array",2,"hello"]
. 경로는 hello
최상위 키 배열의 세 번째 위치에 있는 키를 나타냅니다 array
. 이 경로의 값은 입니다 world
.
다음은 값이 없는 세 개의 배열 세트입니다. 각각은 스트리밍된 .array[2].hello
, 및 (각각)의 마지막 부분을 나타냅니다 ..array[2]
.array
1.6 매뉴얼은 4개의 배열로 스트리밍되는 jq
예제를 사용합니다 .[0,[1]]
[[0],0]
[[1,0],1]
[[1,0]]
[[1]]
0
데이터에 정수 합계가 두 개만 있기 때문에 여기서 무슨 일이 일어나고 있는지 확인하기가 약간 어렵습니다. 우리가 얻는 1
문자열 합계로 변경하는 것이 좋습니다."a"
"b"
[[0],"a"]
[[1,0],"b"]
[[1,0]]
[[1]]
다시 말하지만, 경로와 값이 있는 두 개의 배열이 있고, 그 다음에는 만 포함하는 하위 배열 "b"
과 최상위 배열을 종료하는 두 개의 배열이 있습니다.
이 예제를 더 짧게 유지하면 첫 번째 배열은 경로가 있다고 말합니다. [0]
즉, 최상위 개체는 배열이어야 하며 "a"
첫 번째 위치에 값이 있어야 합니다. 경로는 [1,0]
값이 인 최상위 배열의 두 번째 요소 중 첫 번째 요소를 나타냅니다 "b"
.
"a"
스트리밍 이유에 대한 명확한 질문에 대답하려면 [[],"a"]
경로는 []
다른 객체나 배열에 속하지 않는 것을 나타냅니다. 이 경로의 값은 입니다 "a"
. 즉, "a"
객체도 배열도 아닌 섹션이 있습니다.