代码之家  ›  专栏  ›  技术社区  ›  FangQ

如何使用jq打印由制表符“\t”分隔的JSON数组元素

  •  0
  • FangQ  · 技术社区  · 1 年前

    我正试图使用 .import 作用据我所知,sqlite3.import期望JSON数据为每行一行,其中项目数与表列匹配,并由分隔 .separate .

    如果我定义 .separator="\t" ,我试图使用jq创建一个重新格式化的json文件,但遇到了一个错误。

    这是我的测试

    $echo '[{"a1":{"b1":1,"c1":{"c1":"test","c2":null}}},{"a2":{"b2":1,"c":{"c2":"test","c2":null}}}]' | jq -c '.[] | to_entries'
    
    [{"key":"a1","value":{"b1":1,"c1":{"c1":"test","c2":null}}}]
    [{"key":"a2","value":{"b2":1,"c":{"c2":null}}}]
    

    我的目标是创建以下以制表符分隔的行(\t下面表示制表符 \x09 )

    "a1"\t{"b1":1,"c1":{"c1":"test","c2":null}}
    "a2"\t{"b2":1,"c":{"c2":null}}
    

    但我没能单独用jq实现这种格式。 我可以用新的线把它分开

    $echo '[{"a1":{"b1":1,"c1":{"c1":"test","c2":null}}},{"a2":{"b2":1,"c":{"c2":"test","c2":null}}}]' | jq -c '.[] | to_entries |.[] | [.key, .value] | .[]'
    "a1"
    {"b1":1,"c1":{"c1":"test","c2":null}}
    "a2"
    {"b2":1,"c":{"c2":null}}
    

    但是如果我使用join(“\t”),它会抱怨不能将字符串与对象连接起来

    echo '[{"a1":{"b1":1,"c1":{"c1":"test","c2":null}}},{"a2":{"b2":1,"c":{"c2":"test","c2":null}}}]' | jq -c '.[] | to_entries | .[] | [.key, .value] | join("\t")'
    jq: error (at <stdin>:1): string ("a1\t") and object ({"b1":1,"c1...) cannot be added
    

    我可以使用perl或sed对新行分隔的文本进行后处理,以获得我想要的内容,但我希望学习如何正确地使用 jq .

    这可能吗?

    1 回复  |  直到 1 年前
        1
  •  2
  •   pmf    1 年前

    要获得所需的输出,请使用 @json JSON-encode 任何作为字符串的输入。然后,使用 --raw-output -r )标志以按原样打印字符串值。

    最简单的方法是使用 string interpolation :

    … | jq -r '.[] | to_entries[] | @json "\(.key)\t\(.value)"'
    

    但你也可以使用 join("\t") 在准备好的阵列上的尝试。在这种情况下,使用 tojson 转换器也是可能的:

    … | jq -r '.[] | to_entries[] | [.key, .value | @json] | join("\t")'
    # or
    … | jq -r '.[] | to_entries[] | [.key, .value | tojson] | join("\t")'
    

    输出

    "a1"    {"b1":1,"c1":{"c1":"test","c2":null}}
    "a2"    {"b2":1,"c":{"c2":null}}