【发布时间】:2019-09-15 12:16:37
【问题描述】:
我想将大量文件合并到一个文件中,这个合并文件应该根据文件名的升序进行。我尝试了以下命令,它按预期工作,但唯一的问题是合并后 output.txt 文件在一行中包含整个数据,因为所有输入文件只有一行数据而没有任何换行符。
有没有办法将每个文件数据合并到 output.txt 中作为单独的行,而不是将每个文件数据合并到一行?
我的文件列表的命名格式为9999_xyz_1.json、9999_xyz_2.json、9999_xyz_3.json、.....、9999_xyz_12000.json。
例子:
$ cat 9999_xyz_1.json
abcdef
$ cat 9999_xyz_2.json
12345
$ cat 9999_xyz_3.json
Hello
预期输出.txt:
abcdef
12345
Hello
实际输出:
$ ls -d -1 -v "$PWD/"9999_xyz_*.json | xargs cat
abcdef12345
编辑:
由于我的输入文件不包含任何空格或反斜杠或引号等特殊字符,因此我决定使用以下命令,该命令按预期对我有用。
find . -name '9999_xyz_*.json' -type f | sort -V | xargs awk 1 > output.txt
尝试使用包含空格的文件名,以下是 2 个不同命令的结果。
例子:
$ cat 9999_xyz_1.json
abcdef
$ cat 9999_ xyz_2.json -- This File name contains a space
12345
$ cat 9999_xyz_3.json
Hello
预期输出.txt:
abcdef
12345
Hello
命令:
find . -name '9999_xyz_*.json' -print0 -type f | sort -V | xargs -0 awk 1 > output.txt
输出:
按预期成功完成合并,但最后出现错误。
abcdef
12345
hello
awk: cmd. line:1: fatal: cannot open file `
' for reading (No such file or directory)
命令:
这里我使用了带有-zV选项的排序来避免上述命令中出现的错误。
find . -name '9999_xyz_*.json' -print0 -type f | sort -zV | xargs -0 awk 1 > output.txt
输出:
命令成功完成,但结果不如预期。这里有空格的文件名被视为排序后的最后一个文件。期望是带空格的文件名应该在排序之后的第二个位置。
abcdef
hello
12345
【问题讨论】:
-
在字符级别合并 json 文件,无法生成有效的 json 文件。至少您需要每个 json 文件内容成为父数据结构的子数据结构,可能是一些地图数组。这需要一个 json 解析器。
-
您好 Léa Gris,我关心的是文件的合并,而不是文件包含的数据类型。来自多个文件的数据应该多行连接到一个文件,而不是单行。
-
每个文件之间是否需要双换行符?如果一个换行符就足够了,那么这可能会做到
shopt -s extglob; cat 9999_xyz_+([[:digit:]]).json >output.txt。
标签: bash unix merge concat xargs