我有一个文件包含一些没有行.我希望将文件拆分为具有特定名称的n个文件.每个文件中存在多少行并不重要.我只想要特别的no.of文件(比如5).这里的问题是原始文件中的行号不断变化.所以我需要计算没有行,然后将文件分成5个部分.如果可能,我们必须将它们分别发送到不同的目录中.
小智 39
在bash中,您可以使用该split命令根据所需的行数对其进行拆分.您可以使用wc命令确定所需的行数.这里wc结合了split一行.
例如,onepiece.log分为5个部分
split -l$((`wc -l < onepiece.log`/5)) onepiece.log onepiece.split.log -da 4
Run Code Online (Sandbox Code Playgroud)
这将创建像onepiece.split.log0000... 这样的文件
注意:bash部分向下舍入,所以如果有剩余部分则会有第6部分文件.
在linux上,有一个split命令,
split --lines=1m /path/to/large/file /path/to/output/file/prefix
Run Code Online (Sandbox Code Playgroud)
输出固定大小的INPUT到PREFIXaa,PREFIX,...; 默认大小为1000行,默认PREFIX为"x".没有INPUT,或INPUT为 - 时,读取标准输入.
...
-l, - lines = NUMBER为每个输出文件放置NUMBER行
...
但是,您必须事先计算拆分的实际大小.
split 有一个选项“--number=CHUNKS”,可让您将文件分成多个块。这是来自“split --help”的(修剪)输出:
-n, --number=CHUNKS generate CHUNKS output files; see explanation below
...
CHUNKS may be:
N split into N files based on size of input
K/N output Kth of N to stdout
l/N split into N files without splitting lines
l/K/N output Kth of N to stdout without splitting lines
r/N like 'l' but use round robin distribution
r/K/N likewise but only output Kth of N to stdout
Run Code Online (Sandbox Code Playgroud)
在将其分成 5 部分的情况下,命令将是:
split --number=l/5 inputfile outputprefix
但是,这可能不会导致它们具有相同的行数。
如果您希望它们在最后一行之前都具有相同的行数,则可以使用以下命令:
split -l $(( ($(cat "inputfile" | wc -l) + 5 - 1)/5 )) inputfile outputprefix
此处的两个 5 都可以替换为任何其他数字(确保它们相同)。
下面逐条解释这个命令:
$( )返回您放入其中的任何命令的输出。此处使用 cat 以确保 wc 仅返回行数而不输出输入文件名。
$(( )) 将您放在括号之间的任何内容计算为数学表达式(仅使用整数)并返回结果。
($(cat "inputfile" | wc -l) + 5 - 1)/5 获取输入文件的行数并加 5,减 1,然后将结果除以 5。除法前的加减法确保结果四舍五入,以便准确给出您想要的部分数(在此为 5案件)。
您还可以使用split --number=r/5将其拆分为四个文件,其中每一行在它们之间分布,如下例所示:
inputfile.txt:
1
2
3
4
5
6
7
8
9
outputfile1:
1
6
outputfile2:
2
7
outputfile3:
3
8
outputfile4:
4
9
outputfile5:
5
Run Code Online (Sandbox Code Playgroud)
这不会保留文件顺序。但在不重要的情况下它可能很有用。
| 归档时间: |
|
| 查看次数: |
34636 次 |
| 最近记录: |