用分隔符将多个文件合并为一个文件

Don*_*n P 4 linux shell json cat

我有几个(〜300,000)个单个JSON对象的文件,我想合并为一个JSON数组的文件。假设它们都在“〜/ data_files”位置,如何在Linux上执行此操作?

文件A

{
  name: "Test",
  age: 23
}
Run Code Online (Sandbox Code Playgroud)

文件B

{
  name: "Foo",
  age: 5
}
Run Code Online (Sandbox Code Playgroud)

文件库

{
  name: "Bar",
  age: 5
}
Run Code Online (Sandbox Code Playgroud)

示例输出:(以括号开头和结尾,并在对象之间添加逗号)

[
    {
      name: "Test",
      age: 23
    },
    {
      name: "Foo",
      age: 5
    },
    {
      name: "Bar",
      age: 5
    }
]
Run Code Online (Sandbox Code Playgroud)

我尝试过的

我知道我可以cat用来合并一堆文件,尚不确定如何对目录中的所有文件进行合并,但可以尝试解决。还试图弄清楚,我要串联的文件之间的关系,还没有看到命令。

Nia*_*ove 6

由于您对Unix似乎有点陌生,因此我将尝试为您提供一种简单且不会引入太多新概念的解决方案。我将把聪明新颖的海报留给其他海报。该解决方案将非常有效,因为我所做的只是将文件流式传输为文件。

首先,我们将在主目录中创建一个带有方括号的新文件。
echo "[" > ~/tmp.json

现在,我们遍历data_files目录中的所有文件,并将它们附加到我们的新文件中。在>>将它们添加到什么已经存在。如果使用a,>则文件每次都会被覆盖。完成输出文件后,echo会添加一个逗号cat
for i in ~/data_files/*; do cat $i;echo ","; done >> ~/tmp.json

因此,现在我们将30万个文件保存在一个名为tmp.json的文件中,每个条目都用逗号分隔,但是文件的最后一行也是逗号,这不是我们想要的。下面
sed命令的行为类似于,cat只是'$d'告诉它忽略了文件的最后一行。
因此,我们使用临时文件的最后一行(除了最后一行)创建了一个新文件。
sed '$d' ~/tmp.json > ~/finished.json

我们需要关闭方括号
echo "]" >> ~/finished.json

最后,我们删除临时文件 rm ~/tmp.json

我们完成了。

[
{
    name: "Test",
    age: 23
}
,
{
    name: "Foo",
    age: 5
}
,
{
    name: "Bar",
    age: 5
}
]
Run Code Online (Sandbox Code Playgroud)

快速浏览这篇关于漂亮地打印json的文章,将指向您一个命令行工具,该工具将获取您的finish.json文件并将其准确地转换为您想要的输出。