我有一个我在elasticsearch上运行的查询的输出,我要解析它以提供每行两个条目的csv。
我正在使用的示例输出是:
{
"_index": "file__mdata",
"_type": "assets",
"_id": "24607c5a-2c6g-416a-ab88-58fha56a34ac",
"_version": 6,
"found": true,
"_source": {
"meta": {
"Item Id": "dd0bd495-a4af-49c0-95e3-554097ed6a35",
}
}
},
{
"_index": "file__mdata",
"_type": "assets",
"_id": "fgtaf7g2-32b8-4278-8ca0-3bc0g30ae592",
"_version": 8,
"found": true,
"_source": {
"meta": {
"Item Id": "de2acr1d-5d1b-4171-85d7-d76adbf50cc3",
}
}
}
计划最终得到以下结论:
"_id": "24607c5a-2c6g-416a-ab88-58fha56a34ac","Item Id": "dd0bd495-a4af-49c0-95e3-554097ed6a35"
所以我必须通过grep -a 5运行输出来过滤外部区域,然后通过sed管道流,每行带有s标志,以删除其间的每一行(使用版本行上的regEx)。输出最终看起来像:
"_id": "24607c5a-2c6g-416a-ab88-58fha56a34ac",
"Item Id": "dd0bd495-a4af-49c0-95e3-554097ed6a35",
"_id": "fgtaf7g2-32b8-4278-8ca0-3bc0g30ae592",
"Item Id": "de2acr1d-5d1b-4171-85d7-d76adbf50cc3",
尝试运行tr来删除空格似乎没有达到预期的效果,我似乎唯一可以实现的输出将所有剩余文本放在一行上。
我觉得多管道sed方法是复杂的,必须有一个更直接的方法,可以处理多行输入。这可以在记事本++中实现,例如我希望我最终得到一个脚本,我可以在非常大的输出上运行,文本编辑器很难打开。
有什么建议吗?道歉,如果这对你们中的一些人感觉非常直接,但我在野草中迷失了。
答案 0 :(得分:1)
如果sampleInput是带有您输入的测试文件,那么:
awk '/"_id"/ {printf "%s", $0} /"Item Id"/ {printf "%s\n", $0}' sampleInput
生成这个:
"_id": "24607c5a-2c6g-416a-ab88-58fha56a34ac", "Item Id": "dd0bd495-a4af-49c0-95e3-554097ed6a35",
"_id": "fgtaf7g2-32b8-4278-8ca0-3bc0g30ae592", "Item Id": "de2acr1d-5d1b-4171-85d7-d76adbf50cc3",
答案 1 :(得分:0)
$ awk -F'^[[:space:]]+|,[[:space:]]*$' -v OFS=, '/"_id":/{id=$2} /"Item Id":/{print id, $2}' file
"_id": "24607c5a-2c6g-416a-ab88-58fha56a34ac","Item Id": "dd0bd495-a4af-49c0-95e3-554097ed6a35"
"_id": "fgtaf7g2-32b8-4278-8ca0-3bc0g30ae592","Item Id": "de2acr1d-5d1b-4171-85d7-d76adbf50cc3"