Sed / awk / tr - 删除多行字符串和格式

时间:2016-05-19 16:28:06

标签: json bash awk sed grep

我有一个我在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方法是复杂的,必须有一个更直接的方法,可以处理多行输入。这可以在记事本++中实现,例如我希望我最终得到一个脚本,我可以在非常大的输出上运行,文本编辑器很难打开。

有什么建议吗?道歉,如果这对你们中的一些人感觉非常直接,但我在野草中迷失了。

2 个答案:

答案 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"