Shell 分割成固定的序列并保留额外的

Shell 分割成固定的序列并保留额外的,shell,unix,split,Shell,Unix,Split,我想限制所有文件的固定长度相同,但最后一项可以是任何可变大小,但不超过557。 这意味着文件量可以超过由命令split的标志-n确定的值 代码1(正常) 其中xaa是序列的第一个文件,xao是最后一个文件。 我将序列增加了一个单位,但它导致最后一个文件xao中增加了5个单位(557->562),我不理解: $ seq -w 1 1672 > /tmp/k && gsplit -n15 /tmp/k && wc -c xaa && wc -c

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

代码1(正常) 其中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 因此,将整个长度增加一个序列(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 因为
seq-w 1 1671
每个数字生成5个字符-4个数字和1个换行符。因此,向输出中添加一个数字会向输出中添加5个字节

额外答案-代码2 您已经要求GNU
split
(也称为
gsplit
)将文件输入分割成15个块。它尽最大努力平衡这些值。但是当字节总数不是15的倍数时,它可以做的事情是有限的。可以选择控制发生的事情

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

额外答案-代码3 首先,
seq-w 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。因此只有一个不同。

原始答案-代码1 因为
seq-w 1 1671
每个数字生成5个字符-4个数字和1个换行符。因此,向输出中添加一个数字会向输出中添加5个字节

额外答案-代码2 您已经要求GNU
split
(也称为
gsplit
)将文件输入分割成15个块。它尽最大努力平衡这些值。但是当字节总数不是15的倍数时,它可以做的事情是有限的。可以选择控制发生的事情

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

额外答案-代码3 首先,
seq-w 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。因此只有一个不同。

原始答案-代码1 因为
seq-w 1 1671
每个数字生成5个字符-4个数字和1个换行符。因此,向输出中添加一个数字会向输出中添加5个字节

额外答案-代码2 您已经要求GNU
split
(也称为
gsplit
)将文件输入分割成15个块。它尽最大努力平衡这些值。但是当字节总数不是15的倍数时,它可以做的事情是有限的。可以选择控制发生的事情

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

额外答案-代码3 首先,
seq-w 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。因此只有一个不同。

原始答案-代码1 因为
seq-w 1 1671
每个数字生成5个字符-4个数字和1个换行符。因此,向输出中添加一个数字会向输出中添加5个字节

额外答案-代码2 您已要求GNU
split
(也称为
gsplit
)拆分fi