我想将所有文件限制为相同的固定长度,但最后一项可以是任何可变大小但不超过557。
这意味着文件数量可能超过命令-n
的标志split
。
$ 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个单位?
$ 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个字符。
现在让我们通过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,然后确定成功文件的文件数量?
答案 0 :(得分:3)
因为seq -w 1 1671
每个数字生成5个字符--4个数字和1个换行符。因此,在输出中添加一个数字会为输出增加5个字节。
您已经请求GNU split
(又名gsplit
)将文件输入拆分为15个块。它尽力使价值出来。但是当总字节数不是15的倍数时,它可以做什么是有限的。有控制发生的事情的选项。
但是,在基本形式中,-n 15
选项意味着前14个输出文件每个获得445个字符,最后一个输出455,因为输出文件中有6685 = 445 * 15 + 10个字符。当你向文件中添加另外4个字符时(因为你删除了换行符),那么最后一个文件会获得额外的4个字符(因为6689 = 445 * 15 + 14)。
首先,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.因此差异只有一个。