저는 현재 jq
아래 예와 같이 정수 목록이 포함 된 JSON 파일을 처리 하는 데 사용 하는 방법을 찾고 있습니다.
[
{
"box_id": 1,
"number_items": [
4,
6,
7,
5
]
},
{
"box_id": 3,
"number_items": [
15,
null,
15,
9
]
},
{
"box_id": 6,
"number_items": [
2,
4,
0,
1
]
}
]
첫째, 나는 각각의 최대 값을 얻으려고 노력하고 box_id
있습니다. 최대 값을 얻는 것은 예를 들어 상대적으로 간단 jq '.[].number_items | max
합니다.
7
15
4
그러나 저는 이것을 새로운 JSON 파일에 저장하고 싶습니다.
[
{
"box_id": 1,
"max_items": 7
},
{
"box_id": 3,
"max_items": 15
},
{
"box_id": 6,
"max_items": 4
}
]
다른 부분은 좀 더 복잡합니다. 각 목록에서 연속 된 항목의 절대 차이의 합을 찾는 방법은 box_id
무엇입니까? 예를 들어, [4,6,7,5]
차이 [6-4=2, 7-6=1, 5-7=-2]
=에 해당하는을 고려하십시오 [2,1,-2]
. 그 절대 값의 합은 2+1+2
= 5
입니다. 목록에는 null
값 이 포함될 수 있습니다 . 이러한 항목은 제거해야합니다. 그래야 차이 와 절대 합계에 해당하는 [15,null,15,9]
것을 얻을 수 있습니다.[15,15,9]
[0,-6]
6
jq에 약간 익숙해지면 첫 번째 문제는 사소하므로 해결책을 제시하는 것 이상을 말하지 않겠습니다.
map( {box_id, max_items: (.number_items | max) } )
두 번째 문제에 대한 요구 사항은 약간 불분명하지만 필요에 맞게 다음을 쉽게 조정할 수 있습니다. 첫째, 도우미 함수 differences
:
# Input: an array
# Output: a non-empty stream of non-negative integers
def differences:
def abs: if . < 0 then - . else . end;
map( select(. != null) )
| if length == 0 then 0
elif length == 1 then (.[0]|abs)
else range(1;length) as $i | ( .[$i] - .[$i - 1] ) | abs end;
그런 다음 다음과 같이 사용할 수 있습니다.
map( {box_id, sumAD: ( [.number_items | differences] | add) } )
그러나 (메모리 사용 관점에서) differences
스트림 을 방출 한다는 사실을 활용하는 것이 더 좋습니다 .
def sigma(s): reduce s as $x (0; . + $x);
map( {box_id, sumAD: ( sigma(.number_items | differences) ) } )
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다