要分成固定的序列,并留下额外的

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

代码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'

 $ 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单位,但减lessxao 9个单位。 这种行为是我不保持这种逻辑。

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

原始答案 – 代码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。