Shell 分割成固定的序列并保留额外的
我想限制所有文件的固定长度相同,但最后一项可以是任何可变大小,但不超过557。 这意味着文件量可以超过由命令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
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
您已经要求GNUsplit
(也称为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
您已经要求GNUsplit
(也称为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
您已经要求GNUsplit
(也称为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
您已要求GNUsplit
(也称为gsplit
)拆分fi