以下的perl脚本,将一个大文本文件分割成两个,如果总行数为奇数,第一个文件.out1多一行,如果是偶数,两个文件中的行数相同。可以用于分割日志文件。
#!/usr/bin/perl
#此程序将一个大文本文件分成两个。
#以一个.txt结尾被分割文件作为参数。
#如果没有提供待分割文本,那么程序中止运行。
die if $#ARGV == -1;
#输入文件以.txt结尾,输出文件替换.txt扩展名为.out1和.out2
$outfile1 = $ARGV[0];
$outfile2 = $ARGV[0];
$outfile1 =~ s/..+$/.out1/i;
$outfile2 =~ s/..+$/.out2/i;
#打开或者创建输出文件以供写入。
open(OUT1, "> $outfile1") or die "无法创建第一个新文件用以保存分割结果n";
open(OUT2, "> $outfile2") or die "无法创建第二个新文件用以保存分割结果n";
# $Line获取文件的总行数
open(TXT, $ARGV[0]) or die "无法打开被分割文件。n";
@Lines=<TXT>;
$Lines = @Lines;
close (TXT);
# 如果行号小于总行数的一半,该行写入结果文件out1,如果行号大于一半,该行写入out2
$LineNo = 0;
open(TXT, $ARGV[0]) or die "无法打开被分割文件。n";
while ($line = <TXT>) {
$LineNo +=1;
if ($LineNo < ($Lines/2+1) ) {
print OUT1 $line;
}
else{
print OUT2 $line;
}
}
print "已经分割完毕!";
#关闭输入、输出文件
close(TXT);
close(OUT1);
close(OUT2);
sub usage
{
print "nt usage = perl split1.pl 你的待分割文件n";
}
另外的方法参考。
使用方法是:
splitfile 文件名 拆分行數
譬如要將含1000000行文本的文件abc.txt按每250000行拆為一個文件,祇須執行:
splitfile abc.txt 250000
open (IN, "$ARGV[0]" ) || do {
print "n冇辦法打開文件$ARGV[0]。nn使用方法:nsplitfile 文件名 拆分行數n";
exit 0; };
@char = <IN>;
close IN;
!$ARGV[1] && do {
print "n請指定拆分行數。nn使用方法:nsplitfile 文件名 拆分行數n";
exit 0; };
@char<=$ARGV[1] && do {
print "n指定嘅拆分行數大過文件總行數,$ARGV[0]冇必要拆分。n";
exit 0; };
($j = @char/$ARGV[1]) =~ s/..*//;
@char%$ARGV[1] && $j++;
for ($i=1, $f=A; $i<=$j; $i++, $f++) {
open ($f, ">分割$i.txt" ) || do {
print "n創建文件「分割$i.txt」失敗!n";
exit 0; };
&RW($f);
close ($f);
}
sub RW {
my ($a) = @_;
@$a = splice (@char, 0, $ARGV[1]);
select $a;
print @$a;
}