如何拆分大文件?

use*_*326 5 command-line bash regex

如何传递 list.txt 中的所有文件,它看起来像

file1_1.txt
file1_2.txt
file1_3.txt
file1_4.txt
Run Code Online (Sandbox Code Playgroud)

split命令(目录中有其他 txt 文件)并使其返回编号为中的部分(假设 file1_1.txt 将被分成 4 个部分)

file1_1_1.txt;
file1_1_2.txt;
file1_1_3.txt;
file1_1_4.txt 
Run Code Online (Sandbox Code Playgroud)

等等....

May*_*hux 6

为了确保没有换行符,您可以使用除c.

split -n #number
Run Code Online (Sandbox Code Playgroud)

通过 #number 块分割文件,因此您可以确保它们相等并且行中没有中断。示例

split -n 4 file.txt
Run Code Online (Sandbox Code Playgroud)

这会将 file.txt 分成 4 个块。

或者您可以按行数拆分

split -l #number-of-lines
Run Code Online (Sandbox Code Playgroud)

例子

split -l 200 file.txt
Run Code Online (Sandbox Code Playgroud)

这会将 file.txt 拆分为每个 200 行的文件。但这并不准确,因为最后一个文件的长度可能小于所选的数字。

现在关于命名。命令拆分的默认值是使用默认后缀“x”和默认前缀“aa”“ab”“ac”...

因此,为了更改这些默认值,您必须声明要使用的后缀。

在你的情况下,你可以使用

split -n #number file1_1.txt file1_1.
Run Code Online (Sandbox Code Playgroud)

输出会像 file1_1.aa file1_1.ab file1_1.ac

否则,您可以使用以下方法将默认前缀更改为数字 -d

  split -n #number -d file1_1.txt file1_1.
Run Code Online (Sandbox Code Playgroud)

输出会像 file1_1.00 file1_1.01 file1_1.02

因此,除非您使用 someawksedREGEX,否则您无法通过默认拆分获得所需的命名。

现在从一个文件中读取一组文件让我们调用 files.list

while IFS= read -r file

do split -n #number -d "$file" "$file"

done < files.list
Run Code Online (Sandbox Code Playgroud)

更新:我来到这个https://unix.stackexchange.com/questions/32626/split-a-file-by-line-and-have-control-over-resulting-files-extension

根据第二个答案

gnu split one 的最新版本 (? 8.16) 可以使用 --additional-suffix 开关来控制生成的扩展名。从人分裂:

--additional-suffix=SUFFIX 在文件名后附加一个额外的后缀。所以在使用该选项时:

split -dl 10000 --additional-suffix=.txt words wrd 结果片段将自动以 .txt 结尾:

wrd00.txt wrd01.txt

因此,在您的情况下,如果您的拆分版本 >8.16,那么您可以像这样满足您的需求

split -n #number -d --additional-suffix=.txt file1_1.txt file1_1-
Run Code Online (Sandbox Code Playgroud)

所以输出会像

file1_1-00.txt file1_1-01.txt file1_1-02.txt .....
Run Code Online (Sandbox Code Playgroud)