【问题标题】:How to decode a JSON-encoded column in awk?如何在 awk 中解码 JSON 编码的列?
【发布时间】:2013-02-03 19:44:39
【问题描述】:

假设我有一个制表符分隔的文件。在其中,我有一个以 JSON 编码的数据列。有没有办法解码 JSON 数据并以有意义的方式使用它?理想情况下,该方法会将 JSON 数据解码为 awk 的哈希表/数组。或者,像 Hive 的 get_json_object 这样的东西也可以使用。

【问题讨论】:

  • IMO 这可能是考虑从 awk 转移到更通用的语言的好时机。
  • 我怀疑 awk 专家正在查看这个问题并想知道 JSON 到底是什么,而 JSON 专家正在查看它并想知道 awk 到底是什么。也许有点夸张,但希望你明白,阅读这篇文章的人不太可能是这两个领域的专家。如果您想从 awk 专家那里获得关于如何解码 JSON 的信息,请发布一些示例输入和预期输出。
  • 感谢大家的回答和cmets!让我这样说:请记住,我有自己的理由以这种方式使用 awk。我知道还有其他方法可以解析 JSON。在你批评这是否应该在 awk 中完成之前,我只是要求你理解问题的重点是如何,而不是为什么。因此,如果您决定回答这个问题,请尽可能将注意力集中在“如何”上。谢谢!

标签: json shell unix awk


【解决方案1】:

Awk 没有任何解码 JSON 的工具。是时候改用更通用的编程语言了,比如 Perl、Python 或 Ruby,它们都有处理 JSON 和列分隔文本的模块。

【讨论】:

    【解决方案2】:

    tl;dr:不要这样做。

    详细说明一下普遍看法:Awk 有函数(包括递归)、关联数组、许多支持正则表达式的内置字符串函数。所以,是的,可以为此编写一个 awk 程序。这可以在单行中完成吗,这是 awk 的主要用途?不太可能。

    例如考虑这个微小的 JSON“对象”:{a: b, c: d} 作为唯一的字段。

    这可能是你的 awk 程序:

    echo {a: b, c: d} | awk 'BEGIN {FS="\t"}
         {sub("{", "", $1); sub("}", "", $1); split($1, array, ", ");
             for (key in array) {
                 split(array[key], array2, ": ");
                 dict[array2[1]] = array2[2];
             }
         }
         END {for (key in dict) print key, dict[key]}'
    

    这最终会给你一个“dict”,键为“a”和“b”,值为“c”和“d”。难以构建,更难维护和修改。为自己省去麻烦。有许多更整洁的选择。例如Python JSON.

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2014-10-10
      相关资源
      最近更新 更多