+ -
当前位置:首页 → 问答吧 → windows下的split命令小脚本

windows下的split命令小脚本

时间:2010-11-17

来源:互联网

因为要在windows下分割文件,写了个模仿Unix下split命令的小脚本,权作新手练习。
  1. use strict;
  2. use warnings;

  3. my ($linenum,$file,$pre);

  4. if ($ARGV[0]=~/^\-/) {
  5. ($linenum,$file,$pre)=@ARGV;
  6. $linenum=~s/-(.*?)/$1/;
  7. } else {
  8. #如果不指定分割的行数则默认分割为1000行
  9. $linenum=1000;
  10. ($file,$pre)=@ARGV;
  11. }

  12. die "请输入要分割的文件!" unless defined($file);

  13. die "找不到该文件:$file!" unless -e $file;

  14. #通过把文件读入到一个数组来获取它的行数

  15. my $num;
  16. {
  17. open IN,"$file" || die "打开文件错误:$!";
  18. my @arr=<IN>;
  19. $num=@arr;
  20. close IN;
  21. }

  22. die "错误:一共才$num行,如何分$linenum输出?请调整你的参数!\n" if $num<=$linenum;

  23. #分多少个文件输出

  24. my $filenum=$num/$linenum;

  25. #如果上面的不是整除,则增加一个文件,这里用简单的正则表达式来判断

  26. $filenum=int($filenum+=1) if $filenum=~/.*\..*/;

  27. print "原文件共$num行,分割为每个文件$linenum的话,共有$filenum个文件输出。\n";

  28. #通过判断行数进行分割输出到多个文件名以数字顺序命名的文件,如1.txt、2.txt等

  29. for (my $x=1;$x<=$filenum;$x++) {
  30. open IN,"$file" || die "打开文件错误:$!";
  31. my $fname=defined($pre)?"$pre$x":"x$x";
  32. open OUT,">$fname.txt";
  33. while (<IN>) {
  34. print OUT $_ if $.<=$x*$linenum and $.>($x-1)*$linenum;
  35. }
  36. close OUT;
  37. close IN;
  38. }

  39. print "文件分割完成!\n";
复制代码
存为split.pl ,该脚本符合split命令格式:
格式: split.pl  [-n] file [name]
参数说明:
-n: 指定截断的每一文件的长度,不指定缺省为1000行
file: 要截断的文件
name: 截断后产生的文件的文件名的开头字母,不指定,缺省为x,即截断后产生的文件的文件名为x1,x2,x3....
例:
split -100 myfile ddd
将文件myfile依次截断到名为ddd1,ddd2,ddd3.....的文件中,每一文件的长度为100行

作者: x9x9   发布时间: 2010-11-17

为什么不用Getopt::Long

作者: 黑色阳光_cu   发布时间: 2010-11-17