将3个jq命令合并为一个命令,生成一个以逗号分隔的文件



我想为正在处理的数组中的每个JSON对象运行以下jq命令:

jq -r '.[].Messages | .[].MessageId' combinded.json
jq -r '.[].Messages | .[].Attributes.SentTimestamp|tonumber|(. /1000) | strftime("%Y-%m-%dT%H:%M:%S %Z")' combinded.json
jq -r '.[].Messages | .[].Body | fromjson | .fileLocation.key' combinded.json

输出应该显示为:MessageId, date-time, filelocation-key

我尝试了通常的方法,但都不起作用。有什么建议吗?

以下是JSON示例:
[
{
"Messages": [
{
"MessageId": "3ee11508-b7d0-4116-aed4-8c4abe399fd4",
"Body": "{"key":"tmp/20220607_015010_163546.pgp","eTag":"506f370e6a184b38ae4ad9988e396384","versionId":null}",
"Attributes": {
"SentTimestamp": "1654581487500"
}
}
]
},
{
"Messages": [
{
"MessageId": "3ee11508-b7d0-4116-aed4-8c4abe399fd7",
"Body": "{"key":"tmp/20220607_015010_163547.pgp","eTag":"506f370e6a184b38ae4ad9988e396384","versionId":null}",
"Attributes": {
"SentTimestamp": "1654581487700"
}
}
]
}
]

用这3个过滤器创建一个数组,然后将其传递给join(", ")
(或@csv,如果你不需要这些空格)

.[].Messages[] | [ .MessageId,  (.Attributes.SentTimestamp | tonumber / 1000 | strftime("%Y-%m-%dT%H:%M:%S %Z")), (.Body | fromjson | .eTag) ] | join(", ")

给出(with--raw output):

3ee11508-b7d0-4116-aed4-8c4abe399fd4, 2022-06-07T05:58:07 UTC, 506f370e6a184b38ae4ad9988e396384
3ee11508-b7d0-4116-aed4-8c4abe399fd7, 2022-06-07T05:58:07 UTC, 506f370e6a184b38ae4ad9988e396384

(最后一个过滤器缺少一个键,因此我为示例选择了另一个键)

在线演示

最新更新