【问题标题】:bash split one line file into more lines based on a conditionbash 根据条件将一行文件拆分为多行
【发布时间】:2014-06-10 13:52:20
【问题描述】:

您好,我有一个由行组成的 json 文件,其中每一行都包含类似的内容:

[{“user1”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7},{“user2”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7},{“user3”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7}]

(都在同一行)

我想创建一个文件,其中每一行都是这样的(每行一个用户):

{“user1”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7}
{“user2”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7}
{“user3”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7}

我该怎么做?

【问题讨论】:

  • 您是否知道您想要的结果包含的左括号多于右括号?
  • 现在应该没问题了。价值观并不重要。这只是一个重新格式化的问题。
  • 您的 JSON 无效。

标签: json bash unix awk split


【解决方案1】:

这应该可以,用换行符和,{ 替换,{ 并从倒数第二个字符获取子字符串。

awk '{ gsub(",{","\n{"); {print substr($0, 2, length($0) - 2)} }' file

【讨论】:

    【解决方案2】:

    在我看来,输入是 JSON(或兼容),尽管您没有说明您刚刚命名为 value 的部分的具体值。我为这些values 中的每一个假设一个普通的42,然后使用适当的JSON 解析来实现你想要的。我选择的解析器是 Python JSON 库,当然其他的也可以。

    我冒昧地修正了输入。缺少几个右括号。

    结果与您要求的格式不完全一样,但是由于缺少右括号(我对您的问题发表了评论),您所要求的在语法上是无意义的,我认为输出格式不是固定的。无论如何,复杂的部分是正确的解析;那么输出就很简单了。

    echo '[{"key1":{"key2":"value","key2":[{"key3":42,"key4":"value"}],"key5":42}},{"key1":{"key2":"value","key2":[{"key3":42,"key4":"value"}],"key5":42}},{"key1":{"key2":"value","key2":[{"key3":42,"key4":"value"}],"key5":42}},{"key1":{"key2":"value","key2":[{"key3":42,"key4":"value"}],"key5":42}}]' \
      | python -c 'import json, sys; v=json.load(sys.stdin); print "\n".join(str(x) for x in v)'
    

    【讨论】:

    • 对不起,我改变了问题,你想现在检查吗?
    【解决方案3】:

    对于给定的输入,这样做:

    sed -re 's/(\{"key1)/\n\1/g' | sed -re '/^\[/ d'
    

    但是正如 Alfe 所说,您的左括号比右括号多。 json 解析器也是一个更好的答案。

    【讨论】:

    • 对不起,我稍微改了一下问题,我意识到了错误..希望你能检查一下..
    • 我会添加一个新的答案。
    【解决方案4】:

    编辑新版本的问题输入:

    sed -e 's/^\[//' -e 's/]$/}/' -e 's/,{/}\n{/g'
    

    它有点不漂亮(虽然你只需要最后一点 - 前两个s/s 只是为了整理开/关[,]s

    $ echo '[{“user1”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7},{“user2”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7},{“user3”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7}]' | sed -e 's/^\[//' -e 's/]$/}/' -e 's/,{/}\n{/g'
    {“user1”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7}}
    {“user2”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7}}
    {“user3”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7}}
    

    【讨论】:

    • 如果value{"a":"b", "c":"d"} 这样会产生意想不到的结果。
    • 同样在 awk awk '{ gsub("},","}\n[") ;print}' file
    • 假设“key7”始终相同是否合理?
    • 值无关紧要。我想要的只是以正确的方式格式化文档。每行应该是不同的用户
    • 键是否每次都相同很重要,就好像它们一样,它可能会提供一个额外的项目来关闭拆分检测,尽管除非您的键/值有奇怪的东西,我认为不需要(反思)。
    【解决方案5】:

    您可以将输入通过管道传输到perl -ple 's|({“user)|\n$1|g' |sed -re 's/^\[|\]$//g' | sed -re '/^$/ d'

     echo '[{“user1”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7},{“user2”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7},{“user3”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7}]' | perl -ple 's|({“user)|\n$1|g' |sed -re 's/^\[|\]$//g' | sed -re '/^$/ d'
    {“user1”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7},
    {“user2”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7},
    {“user3”:{“key1”:”value”,”key2”:”value2”,”key3”:[{“key4”:”value4”,”key5”:”value5”}],”key6”:”value6”},”key7”:”value7}
    

    附言。 json 解析器仍然是一个更好的答案:)

    【讨论】:

      猜你喜欢
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多