perl筛选记录并保存为文件

发布时间:2020-12-14编辑:脚本学堂
需求:一批文件,12个,每个文件命名规则是promoter_****,
这些文件中保存一条条记录,每条记录10个字段,第七个字段,要取出来,如果该字段绝对值小于等于1000...

需求:
一批文件,12个,每个文件命名规则是promoter_****,
这些文件中保存一条条记录,每条记录10个字段,第七个字段,要取出来,如果该字段绝对值小于等于1000,则将该记录取出来,保存到promoterLT1000_****中。
用vi :setlist观察文件,发现记录字段以^I( )分隔,所以只需读出每条记录,然后,将该记录split,比较得到的数组的偏移为6的绝对值是否不大于1000,然,则打印出来。

处理程序(promoterLT1000.pl)如下:
 

复制代码 代码如下:
#!/usr/bin/perl
my $in = $ARGV[0];
my $out = $ARGV[1];
die "没有输入文件" if(!defined($in));
die "没有输出文件" if(!defined($out));
open(RH,$in) or die "不能读$in:$!";
my @lines = <RH>;
close RH;
open(WH,">$out") or die "不能写$out:$!";
for($i = 0; $i < @lines; $i ++){
    my @fields = split(/ /,$lines[$i]);
    if($fields[6] >= -1000 && $fields[6] <= 1000){
        print WH $lines[$i];
    }
}
close WH;

为例方便处理问题,我又写了一个外部程序来调用该脚本,首先 将所有需要处理的文件名写入文件in.txt
#ls promoter_* > in.txt
然后,编写perl脚本,构造输出文件名,写入in_out.txt(其实这一步可以直接将每一行构造成perl in out直接将文件写成shell^_^)

in_out.pl
 

复制代码 代码如下:
#!/usr/bin/perl
open(RH,"in.txt") or die "$!";
my @lines = <RH>;
chomp @lines;
close RH;
open(WH,">in_out.txt") or die "$!";
for(my $i = 0; $i < @lines; $i ++){
    my @fields = split(/_/,$lines[$i]);
    print WH "$lines[$i] ".$fields[0]."LT1000_".$fields[1]." ";
}
close WH;

这样,在in_out.txt中就保存有输入文件和输出文件名,接下来就是编写一个外围的程序,处理这一批文件
,具体是这样的,写一个脚本,第一个参数 是调用的perl脚本,第二个参数是保存输入输出文件名的文件

cmder.pl
 

复制代码 代码如下:
#!/usr/bin/perl
my $perlcmd = $ARGV[0];
die "no perl script" if(!defined($perlcmd));
my $in = $ARGV[1];
die "no input" if (!defined($in));
open(RH,$in) or die "$!";
my @lines = <RH>; chomp @lines;
close RH;
for(my $i = 0; $i < @lines; $i ++){
    my @fields = split(/ /,$lines[$i]);
    system("perl $perlcmd $fields[0] $fields[1]");
}

最后,执行如下
#perl cmder.pl promoterLT1000.pl in_out.txt

如果写成了shell,则直接
#bash in_out.sh