需求:
一批文件,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