Perl 程序 筛选记录保存文件

[size=medium][color=darkblue]今天早上,有这样的需求,一批文件,12个,每个文件命名规则是promoter_****,
这些文件中保存一条条记录,每条记录10个字段,第七个字段,要取出来,如果该字段绝对值小于等于1000,则将该记录取出来,保存到promoterLT1000_****中
用vi :setlist观察文件,发现记录字段以^I(\t)分隔,所以只需读出每条记录,然后,将该记录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(/\t/,$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]\t".$fields[0]."LT1000_".$fields[1]."\n";
}
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(/\t/,$lines[$i]);
system("perl $perlcmd $fields[0] $fields[1]");
}
最后,执行如下
#perl cmder.pl promoterLT1000.pl in_out.txt
如果写成了shell,则直接
#bash in_out.sh
[/color][/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值