【发布时间】:2017-06-14 12:52:34
【问题描述】:
我有一个文件,其中每一行都是一个 json 对象数组,例如:
[
{
"ts": "2017-06-13 16:59:35,778"
},
{
"id": 39,
"path": "/1497365920809-31368-6D8E756916AE1",
"messageAttributes": {
"some_obsolete_data": "1497365975532",
"more_obsolete_data": "20",
"c": ""
}
},
{
"id": 40,
"path": "/1497365920809-31368-6D8E756916AE1",
"messageAttributes": {
"some_obsolete_data": "some text",
"data_that_I_Need": "Name,1,Text,1497365975568"
}
}
]
每个数组的第一个对象始终是我需要的“时间戳”,但以下对象可能感兴趣也可能不感兴趣。
现在我需要让 jq 将每一行转换为包含时间戳和data_that_I_Need 的 json 对象数组,例如
[
{
"ts": "2017-06-13 16:59:35,778",
"id": 40,
"path": "/1497365920809-31368-6D8E756916AE1",
"messageAttributes": {
"data_that_I_Need": "Name,1,Text,1497365975568"
}
}
]
通过做
jq '
.[] |
select(.messageAttributes.data_that_I_Need != null) |
{
id : .id,
path : .path,
messageAttributes: {
dataThat_I_Need: .messageAttributes.data_that_I_Need
}
}
' <my_file.txt
我可以过滤掉过时的数据。
但是如何将第一个对象中的“ts”字段添加为输出中的字段?
更新
看起来我可以在程序的开头设置一个变量,我可以将其用于所有后续对象...
jq '
.[0].ts as $ts |
.[] |
select(.messageAttributes.data_that_I_Need != null) |
{
ts : $ts,
id : .id,
path : .path,
messageAttributes: {
dataThat_I_Need: .messageAttributes.data_that_I_Need
}
}
' <my_file.txt
【问题讨论】:
-
感谢格式化@Thor :-)