Chinaunix

标题: split多个连续文件分割,如何保证文件号连续?请大虾指教 [打印本页]

作者: C307307    时间: 2011-05-15 12:56
标题: split多个连续文件分割,如何保证文件号连续?请大虾指教
本帖最后由 C307307 于 2011-05-15 15:15 编辑

这里有个问题,简化如下:
假如我生成了10个文件,分别为
file_0001.dat,file2_0002.dat,……,file_0010.dat,每个文件的大小为45M,但要求生成的文件大小不能超过10M,举例如下:
file_0001.dat有45M,则要分成5个文件,分别为new_file_0001.dat,newfile_0002.dat,……,newfile_0005.dat,不管newfile_0005.dat是否
到达10M,file_0002.dat必须从newfile_0006.dat开始分割。所以最后肯定会生成50个文件,
文件从newfile_0001.dat到newfile_0050.dat.
这时候用split命令来分割,如何完成?

ps:这10个文件是依次生成的,也就是可以在每个文件生成后,来split一下。
作者: xiaopan3322    时间: 2011-05-15 13:29
先split,然后cat:
  1. split -b ${blocksize}m ${file} ${filename}
  2. cat ${filename}?* > ${filename}
复制代码

作者: yinyuemi    时间: 2011-05-15 13:43
本帖最后由 yinyuemi 于 2011-05-15 13:48 编辑

回复 1# C307307


    Try:
  1. n=0
  2. for i in *.dat
  3. do
  4.         split -b 5M  "$i" -d x
  5.         for j in {0..4}
  6.         do
  7.                 ((n++))
  8.                 printf -v name "%04.f" $n
  9.                 mv "x0"$j "new_"$name".dat"
  10.         done
  11. done
复制代码

作者: C307307    时间: 2011-05-15 13:49
回复 3# yinyuemi


    谢谢,这个思路可以。
作者: C307307    时间: 2011-05-15 13:51
回复 2# xiaopan3322


    谢谢,
    这两个命令都没怎么看明白 ,能否解释下
作者: xiaopan3322    时间: 2011-05-15 14:18
回复 5# C307307


    可能我一开始理解错了题意,拆分了以后,是不是不需要再重新重组回来的(重新组合用cat)?
    如果不需要重新重组的话,你可以用yinyuemi的思路……
作者: C307307    时间: 2011-05-15 14:34
回复 6# xiaopan3322


    可能是我每说清楚,就是有10个文件,大小超标了,要拆分,拆分后生成的文件要按原来文件的顺序按序号排列。
作者: xiaopan3322    时间: 2011-05-15 14:39
回复 7# C307307


    明白你的意思了,这个需求。。。单纯用split完成不了……做个workaround的吧……
    1. 可否先将那些源文件重组,然后一次性拆分
    2. 先拆分,然后对拆分后的进行处理(比如放到带文件编号的文件夹下,然后通过判断,依次重命名)
作者: C307307    时间: 2011-05-15 14:52
回复 8# xiaopan3322


   
    1.这10个文件不能重组的,他们分别对应10张表,各自独立,不过这个想法倒不错
    2.这样肯定是可以的,不过我感觉较复杂了。
作者: Shell_HAT    时间: 2011-05-15 14:56
回复 7# C307307


能否说说超的是什么标?为何会有那样的标?
作者: C307307    时间: 2011-05-15 15:08
本帖最后由 C307307 于 2011-05-15 15:16 编辑

回复 10# Shell_HAT


  
    其实是对文本进行操作,对源文件的内容每一行添加两个字段,写入到新文件,但新文件不能超过指定大小。
    判断是否超标是在写完后的,因为在每行写入后去判断肯定会影响速度。所以直接在文件写完后,split下。
    这样的文件有10个

i=1   
while  i<=10
do
   awk生成新的文件。
   split新文件
   ……
   i++
done
举例:
file_0001.dat,file2_0002.dat,……,file_0010.dat,每个文件的大小为45M,但要求生成的文件大小不能超过 10M(这个不定):
file_0001.dat有45M,则要分成5个文件,分别为 new_file_0001.dat,newfile_0002.dat,……,newfile_0005.dat,不管newfile_0005.dat是否
到达10M,file_0002.dat必须从newfile_0006.dat开始分割。所以最后肯定会生成50个文件,
文件从newfile_0001.dat到newfile_0050.dat.
  
文件序号如何连续 0001.dat到0050.dat??

要求速度快额
作者: db2-zhang    时间: 2011-05-15 22:04
回复 3# yinyuemi


    想问下:printf -v name "%04.f" $n
这句什么作用啊???

谢了!
作者: yinyuemi    时间: 2011-05-16 01:33
本帖最后由 yinyuemi 于 2011-05-16 05:48 编辑

回复 12# db2-zhang


    将printf得到的值赋于变量name。
http://bbs.chinaunix.net/thread-2300359-1-1.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2