2013-05-14 94 views
-4

我需要建議如何創建一個perl程序,該程序可以使用數字線將文件拆分爲更小的文件。Perl - 如何將文件拆分爲更小的文件

例如:

perl split.pl --file="data.txt" --numberLine=2 

輸入

data.txt中:

line1 
line2 
line3 
line4 

輸出

DATA1.TXT

line1 
line2 

data2.txt

line3 
line4 

perl split.pl --file="data.txt" --numberLine=1 

DATA1.TXT

line1 

data2.txt

line2 

data3.txt

line3 

data4.txt

line4 

或 perl的split.pl --file = 「data.txt中」 --numberLine = 3

DATA1.TXT

line1 
line2 
line3 

data2.txt

line4 

回答

1
#!/usr/bin/perl 
# 

use strict; 
use warnings; 
use Getopt::Long; 
use File::Basename; 
my ($length, $file); 

my $res= GetOptions ("numberLine=i" => \$length, 
         "file=s" => \$file); 

my ($name,$path,$suffix) = fileparse($file,("\.txt","\.dat")); 

open(my $fh,$file) || die "$file $!"; 

my $lc=0; 
my $outfh=undef; 
while(<$fh>) { 
    if (($lc % $length) == 0) { 
      my $n=int($lc/$length)+1; 
      open($outfh,">$name$n.txt") || warn "$name$n.txt $!"; 
      } 
    $lc++; 
    print $outfh $_; 
    } 

另外,這裏是如何做它作爲一個班輪。你剛纔設置的「numberLines」自己的腳本行並提供文件名(S)爲ARGS

perl -n -e 'print; unless (($.-1)%2){$n++;open(F,">data$n.txt")} print F $_' data.txt 
+0

有幾件事情,我注意到,請以此爲建設性批評:(1)'vars'編譯指示是不必要的,因爲全局變量可以用'our'聲明。但爲什麼你甚至需要全局變量? (2)'fileparse'的後綴被視爲正則表達式,而不是字符串,所以'''應該真正被轉義。 (3)可以使用'$ .'變量代替手動計數行。 (4)除非你想重置'$ .'計數器,否則在重新打開文件句柄之前關閉一個文件句柄並不是必須的。 (5)您不能從只寫文件句柄''。 – amon 2013-05-14 08:50:20

+0

1)把''vars''改成''my'' 2)逃脫的點3)在長版本的櫃檯上留下,因爲它可能更清晰4)刪除關閉5)一個班輪是batshit錯誤,現在糾正。謝謝@amon! – Vorsprung 2013-05-14 09:15:31

5

分裂:

system("split -l 2 $file"); 
0
sed -e '1,2wdata1.txt' -e '3,$wdata2.txt' data.txt