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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章