我想限制所有的文件是相同的固定长度,但最后一项可以是任何可变的大小,但不超过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,然后确定成功文件的文件数量?
发布于 2015-07-05 22:07:04
原始答案-代码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,因此只有一个。
https://stackoverflow.com/questions/31231098
复制相似问题