分成固定的序列并留出额外的

时间:2015-07-05 13:56:42

标签: shell unix split

我想将所有文件限制为相同的固定长度,但最后一项可以是任何可变大小但不超过557。 这意味着文件数量可能超过命令-n的标志split

代码1(确定)

$ seq -w 1 1671 > /tmp/k && gsplit -n15 /tmp/k && wc -c xaa && wc -c xao
557 xaa
557 xao

其中 xaa 是序列的第一个文件,而 xao 是最后一个文件。 我将序列增加一个单位但在最后一个文件 xao 中导致5个单位增加(557-> 562),我不明白:

$ seq -w 1 1672 > /tmp/k && gsplit -n15 /tmp/k && wc -c xaa && wc -c xao
557 xaa
562 xao

为什么按顺序增加一个单位会使最后一项(xao)增加5个单位?

代码2

$ seq -w 1 1671 | gsed ':a;N;$!ba;s/\n//g' > /tmp/k && gsplit -n15 /tmp/k&& wc -c xaa && wc -c xao
445 xaa
455 xao
$ seq -w 1 1672 | gsed ':a;N;$!ba;s/\n//g' > /tmp/k && gsplit -n15 /tmp/k&& wc -c xaa && wc -c xao
445 xaa
459 xao
因此,将整个长度增加一个序列(4个字符)导致4个字符增加(455-> 459),而第一个代码增加为5个字符。

代码3

现在让我们通过seq -w 0 0.0001 1 | gsed 's/\.//g'将每个序列单位固定为4个字符:

$ seq -w 0 0.0001 1 | gsed 's/\.//g' |  gsed ':a;N;$!ba;s/\n//g' > /tmp/k && gsplit -n15 /tmp/k&& wc -c xaa && wc -c xao
3333 xaa
3344 xao
$ seq -w 0 0.0001 1.0001 | gsed 's/\.//g' |  gsed ':a;N;$!ba;s/\n//g' > /tmp/k && gsplit -n15 /tmp/k&& wc -c xaa && wc -c xao
3334 xaa
3335 xao

因此,将序列增加一个字符会逐个增加 xaa ,但会将 xao 减少9个单位。 这种行为是我不太合乎逻辑的。

如何首先限制序列长度,例如固定为557,然后确定成功文件的文件数量?

1 个答案:

答案 0 :(得分:3)

原始答案 - 代码1

因为seq -w 1 1671每个数字生成5个字符--4个数字和1个换行符。因此,在输出中添加一个数字会为输出增加5个字节。

额外答案 - 代码2

您已经请求GNU split(又名gsplit)将文件输入拆分为15个块。它尽力使价值出来。但是当总字节数不是15的倍数时,它可以做什么是有限的。有控制发生的事情的选项。

但是,在基本形式中,-n 15选项意味着前14个输出文件每个获得445个字符,最后一个输出455,因为输出文件中有6685 = 445 * 15 + 10个字符。当你向文件中添加另外4个字符时(因为你删除了换行符),那么最后一个文件会获得额外的4个字符(因为6689 = 445 * 15 + 14)。

额外答案 - 代码3

首先,seq -w 0 0.0001 1的输出如下:

0.0000
0.0001
0.0002
…
0.9998
0.9999
1.0000

因此,在使用第一个sed编辑输出后,存在从00000到10000的数字,每行一个,每行6个字符(包括换行符)。第二个sed再次消除了换行符。

一行/tmp/k中有50006个字节。这相当于15 * 3333 + 11,因此是第一个输出。第二个变体在/tmp/k中有50011个字节,即15 * 3334 + 1.因此差异只有一个。