使用 jq 合并 s3 清单文件
merging s3 manifest files using jq
我有多个 s3 清单文件,每个文件对应给定日期范围内的一个日期。我希望合并所有清单文件以生成单个清单文件,从而允许我执行单个 Redshift 副本。
清单文件 1:
{
"entries": [
{
"url": "DFA/20161001/394007-OMD-Coles/dcm_account394007_activity_20160930_20161001_050403_294198927.csv.gz"
}
]
}
清单文件 2:
{
"entries": [
{
"url": "DFA/20161002/394007-OMD-Coles/dcm_account394007_activity_20161001_20161002_054043_294865863.csv.gz"
}
]
}
我正在寻找类似这样的输出:-
{
"entries": [
{
"url": "DFA/20161001/394007-OMD-Coles/dcm_account394007_activity_20160930_20161001_050403_294198927.csv.gz"
},
{
"url": "DFA/20161002/394007-OMD-Coles/dcm_account394007_activity_20161001_20161002_054043_294865863.csv.gz"
}
]
}
我试过了
jq -s '.[]' "manifest_file1.json" "manifest_file2.json"
和 Whosebug 中发布的其他建议,但无法实现。
因此,如果 "merge" 你的意思是通过连接 "entries"
数组将它们组合成一个数组,你可以这样做:
$ jq 'reduce inputs as $i (.; .entries += $i.entries)' manifest_file{1,2}.json
产生:
{
"entries": [
{
"url": "DFA/20161001/394007-OMD-Coles/dcm_account394007_activity_20160930_20161001_050403_294198927.csv.gz"
},
{
"url": "DFA/20161002/394007-OMD-Coles/dcm_account394007_activity_20161001_20161002_054043_294865863.csv.gz"
}
]
}
或者,不诉诸 reduce
:
$ jq -n '{entries: [inputs.entries[]]}' manifest_file_{1,2}.json
{
"entries": [
{
"url": "DFA/20161001/394007-OMD-Coles/dcm_account394007_activity_20160930_20161001_050403_294198927.csv.gz"
},
{
"url": "DFA/20161002/394007-OMD-Coles/dcm_account394007_activity_20161001_20161002_054043_294865863.csv.gz"
}
]
}
注意inputs
是jq 1.5版本引入的。如果你的jq没有inputs
,可以使用jq -s
,如下:
$ jq -s '{entries: [.[].entries[]]}' manifest_file_{1,2}.json
我有多个 s3 清单文件,每个文件对应给定日期范围内的一个日期。我希望合并所有清单文件以生成单个清单文件,从而允许我执行单个 Redshift 副本。
清单文件 1:
{
"entries": [
{
"url": "DFA/20161001/394007-OMD-Coles/dcm_account394007_activity_20160930_20161001_050403_294198927.csv.gz"
}
]
}
清单文件 2:
{
"entries": [
{
"url": "DFA/20161002/394007-OMD-Coles/dcm_account394007_activity_20161001_20161002_054043_294865863.csv.gz"
}
]
}
我正在寻找类似这样的输出:-
{
"entries": [
{
"url": "DFA/20161001/394007-OMD-Coles/dcm_account394007_activity_20160930_20161001_050403_294198927.csv.gz"
},
{
"url": "DFA/20161002/394007-OMD-Coles/dcm_account394007_activity_20161001_20161002_054043_294865863.csv.gz"
}
]
}
我试过了
jq -s '.[]' "manifest_file1.json" "manifest_file2.json"
和 Whosebug 中发布的其他建议,但无法实现。
因此,如果 "merge" 你的意思是通过连接 "entries"
数组将它们组合成一个数组,你可以这样做:
$ jq 'reduce inputs as $i (.; .entries += $i.entries)' manifest_file{1,2}.json
产生:
{
"entries": [
{
"url": "DFA/20161001/394007-OMD-Coles/dcm_account394007_activity_20160930_20161001_050403_294198927.csv.gz"
},
{
"url": "DFA/20161002/394007-OMD-Coles/dcm_account394007_activity_20161001_20161002_054043_294865863.csv.gz"
}
]
}
或者,不诉诸 reduce
:
$ jq -n '{entries: [inputs.entries[]]}' manifest_file_{1,2}.json
{
"entries": [
{
"url": "DFA/20161001/394007-OMD-Coles/dcm_account394007_activity_20160930_20161001_050403_294198927.csv.gz"
},
{
"url": "DFA/20161002/394007-OMD-Coles/dcm_account394007_activity_20161001_20161002_054043_294865863.csv.gz"
}
]
}
注意inputs
是jq 1.5版本引入的。如果你的jq没有inputs
,可以使用jq -s
,如下:
$ jq -s '{entries: [.[].entries[]]}' manifest_file_{1,2}.json