2016-04-28 203 views
2

我得到了Json輸入數據,我需要重新格式化從unix-time到ISO 8601的時間戳(以後處理文件)。 我試圖通過使用: <input.json jq .[2].timestamp |= jq todate >output.json 這是以正確的方式重新格式化時間戳,但是如何將重新格式化的時間戳恢復到原始文件?我的目標是獲取包含所有信息的原始文件,但重新格式化時間戳。重新格式化從unix到iso的時間戳

它的工作原理是我想在https://jqplay.org/,但不是在命令行。 我感謝您的幫助!

樣品輸入:

[ 
{ 
"channelId": 9088, 
"errorCode": 0, 
"value": 0, 
"timestamp": 1460258309 
}, 
{ 
"channelId": 10087, 
"errorCode": 0, 
"value": 1000, 
"timestamp": 1460258294 
}, 
{ 
"channelId": 10086, 
"errorCode": 0, 
"value": 90, 
"timestamp": 1460258294 
}, 
{ 
"errorCode": 0, 
"errorLine": "" 
} 
] 

通緝輸出:

[ 
{ 
"channelId": 9088, 
"errorCode": 0, 
"value": 0, 
"timestamp": 2016-04-10T03:18:14Z 
}, 
{ 
"channelId": 10087, 
"errorCode": 0, 
"value": 1000, 
"timestamp": 2016-04-10T03:18:14Z 
}, 
{ 
"channelId": 10086, 
"errorCode": 0, 
"value": 90, 
"timestamp": 2016-04-10T03:18:14Z 
}, 
{ 
"errorCode": 0, 
"errorLine": "" 
} 
] 
+0

你能提供一個樣本輸入和預期的輸出?另外,你可能的意思是做'jq'。[2] .timestamp | = todate'',也就是用單引號並且不需要額外的jq調用。 –

+0

增加了輸入和預期輸出。如果我跳過第二個'jq'cmd,我會得到命令拼寫錯誤或無法找到的錯誤。這個問題是否有一個通用的解決方案?我總是遇到這個問題,當我嘗試使用'|'時 –

回答

0

如果你想轉換的 「時間戳」 的每次出現(不管它在哪裏發生),那麼如果你的JQ有walk/1你可以使用以下說明的過濾器:

jq -n '[{timestamp: (24*60*60)}] | walk(if type == "object" and .timestamp then .timestamp |= todate else . end)' 
[ 
    { 
    "timestamp": "1970-01-02T00:00:00Z" 
    } 
] 

如果你的jq沒有hav Ëwalk/1,那麼您可以複製從https://github.com/stedolan/jq/blob/master/src/builtin.jq

+0

對不起,但我不知道如何添加散步的定義,我只是使用jq的可執行文件* .exe版本。我在我的問題中添加了一個示例輸入/輸出。有沒有辦法解決這個問題而不增加散步? –

+0

要添加[走/ 1](https://github.com/stedolan/jq/blob/master/src/builtin.jq#L284-L291)(或任何功能),你可以把它的定義之前,其餘的你的過濾器,例如jq -n'def walk(f):。作爲$ in |如果鍵入==「object」,則將key_unsorted []作爲$ key({};。+ {($ key):($ in [$ key | | walk(f))}}) f elif type ==「array」then map(walk(f))| f else f end; [{timestamp:(24 * 60 * 60)}] | (如果鍵入==「object」和.timestamp,那麼.timestamp | = todate else。end)''。另一種方法是把它放在你的'〜/ .jq'文件中。 – jq170727

2

它的定義有了您的輸入:

<input.json jq 'map(if .timestamp then .timestamp |= todate else . end)' 

輸出爲:

[ 
    { 
    "channelId": 9088, 
    "errorCode": 0, 
    "value": 0, 
    "timestamp": "2016-04-10T03:18:29Z" 
    }, 
    { 
    "channelId": 10087, 
    "errorCode": 0, 
    "value": 1000, 
    "timestamp": "2016-04-10T03:18:14Z" 
    }, 
    { 
    "channelId": 10086, 
    "errorCode": 0, 
    "value": 90, 
    "timestamp": "2016-04-10T03:18:14Z" 
    }, 
    { 
    "errorCode": 0, 
    "errorLine": "" 
    } 
]