2017-04-04 4 views
1

안녕하세요 단일 "jq"명령 내에서 계산을 수행하려고하지만 새 값을 참조하는 방법을 연습 할 수 없습니다.JSON 및 여러 값을 업데이트하는 jq

원래 JSON 내 목표는 초 시대와 운동에 시간을 시작 시간과 종료 시간을 변환하는 것입니다

{ 
    "Status": "Down", 
    "StatusID": "75328241", 
    "Start": "2017-03-17 15:06:40", 
    "End": "2017-03-17 15:08:37", 
    "Period": "1 Minutes " 
} 

. 그런 다음 새 값으로 동일한 객체를 출력하십시오. 내가 할 때

echo $J_SON | jq '.Start |= (strptime("%Y-%m-%d %H:%M:%S") | mktime),.End |= (strptime("%Y-%m-%d %H:%M:%S") | mktime)' 

출력은 다음과 같습니다

의미가
{ 
    "Status": "Down", 
    "StatusID": "75328241", 
    "Start": 1489763200, 
    "End": "2017-03-17 15:08:37", 
    "Period": "1 Minutes " 
} 
{ 
    "Status": "Down", 
    "StatusID": "75328241", 
    "Start": "2017-03-17 15:06:40", 
    "End": 1489763317, 
    "Period": "1 Minutes " 
} 

는 수동이 기본 동작입니다 있다고 말한다.

할당은 대부분의 프로그래밍보다 jq에서 조금 다르게 작동합니다. 언어. jq는 에 대한 참조와 사본을 구별하지 않습니다. 두 객체 나 배열은 같거나 같지 않습니다. "동일한 객체"또는 "같지 않음 객체"라는 추가 개념이 없습니다.

객체가 배열, .foo 및 .bar 인 두 개의 필드를 가지고 있으며, 당신이 .foo 뭔가를 추가 경우 이전에 설정 한 경우에도 경우, 다음 .bar 인은 더 큰받지 않습니다 .bar 인 = .foo . Python, Java, Ruby, Javascript 등의 언어로 으로 프로그래밍하는 데 익숙하다면 을 생각하면됩니다.이전에 jq가 모든 객체의 전체 복사본을 처리하는 것처럼 (성능면에서는 그렇지 않습니다. 실제로 그렇게하지는 않지만, 일반적인 아이디어 인 ).

그러나 그 다음에 초 단위로 값을 출력하고 싶습니다.

나는 성공적으로 같은 기간 얻을 수 있었다 :

echo $J_SON | jq '.Period = ((.End | strptime("%Y-%m-%d %H:%M:%S") | mktime)-(.Start | strptime("%Y-%m-%d %H:%M:%S") | mktime))' 

출력을

{ 
    "Status": "Down", 
    "StatusID": "75328241", 
    "Start": "2017-03-17 15:06:40", 
    "End": "2017-03-17 15:08:37", 
    "Period": 117 
} 

문제 :

나는 각 변수의 개별 값을 얻을 수는 없지만 단일 출력 객체에서 이들을 모두 연결하는 방법을 알아 두십시오.

답변

2

당신은 수 있도록 같은 체인 함께 업데이트 :

.Start |= (strptime("%Y-%m-%d %H:%M:%S") | mktime) 
| .End |= (strptime("%Y-%m-%d %H:%M:%S") | mktime) 
| .Period = (.End - .Start) 
+0

덕분에, 완벽하게 일했다. 내가 이해하지 못하는 것은 ","필터 구분 기호입니다. 특정 값의 하위 객체에서만 작동하는 경우 왜 파이프를 통해 사용할 수 있습니까? 값을 읽고 변경을 할 때 그것을 사용하는 것이 의미가 있다고 생각합니다.이 경우 배관을 필요로하지 않을 것입니다. – Arturski