perl用于分割文件的脚本

发布时间:2019-10-07编辑:脚本学堂
以下的perl脚本,将一个大文本文件分割成两个,如果总行数为奇数,第一个文件.out1多一行,如果是偶数,两个文件中的行数相同。可以用于分割日志文件。

以下的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;
    }

上一篇:perl 命令行替换
下一篇:perl的$_[0],$_[1]