json - 如何将文本文件拆分为多个文件并从行前缀中提取文件名?

标签 json linux bash awk

我有一个简单的日志文件,其内容如下:

1504007980.039:{"key":"valueA"}
1504007990.359:{"key":"valueB", "key2": "valueC"}
...

我想输出到多个文件,每个文件都包含时间戳后面的 JSON 部分作为内容。所以我会得到文件的结果:

1504007980039.json
1504007990359.json
...

这类似于 How to split one text file into multiple *.txt files?但文件名应该从每一行中提取(并删除多余的点),而不是通过索引生成

我最好想要一个可以在 bash 中执行的单行代码。

最佳答案

由于您没有使用 GNU awk,因此您需要关闭输出文件以避免“打开文件过多”错误。为了避免这种情况以及 JSON 中特定值的问题以及与输出重定向期间未定义行为相关的问题,您需要这样做:

awk '{
    fname = $0
    sub(/\./,"",fname)
    sub(/:.*/,".json",fname)
    sub(/[^:]+:/,"")
    print >> fname
    close(fname)
}' file

如果您发现这样做有一些好处,您当然可以将其压缩到一行:

awk '{f=$0;sub(/\./,"",f);sub(/:.*/,".json",f);sub(/[^:]+:/,"");print>>f;close(f)}' file

关于json - 如何将文本文件拆分为多个文件并从行前缀中提取文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45939380/

相关文章:

JSONMarshal : Is it possible to serialize/desrialize into/from 'plain' JSON (without metadata)?

linux - 如何使用带有 kubectl 的字段选择器按任意字段进行搜索?

android - 用于 kivy 的 buildozer,返回错误

bash - 从外部脚本调用函数

linux - bash shell 中的 '$$' 是什么?

linux - Awk 在具有自定义日期格式的文件中查找日期范围内的行

java - twitter4j 4.0.2 getRawJSON() 返回 null

php - Laravel - 排序后从集合中响应 JSON 将项目索引作为对象键

mysql - .mysql_history 没有被自动保存

javascript - Three.js 添加纹理到 JSON 对象