用于批处理文件处理的Perl脚本

时间:2013-07-29 19:31:51

标签: perl bash

我有一个相对简单的问题给你的专家。我在目录中有300个文件,我想用我的perl脚本处理(如下所示)。我想知道是否有办法在perl中的一批文件中使用变量和进程。如果有帮助,我有一个包含文件名列表的文件。 您的反馈将不胜感激。

====================================

#!/usr/bin/perl
use strict;
use warnings;

open (FILE1, "001.txt") or die ("Can't open file $!");

while(<FILE1>){
        my $line = $_;
        chomp $line;
        if ( $line =~ m/^chr/ ) {
            open OUT, '>>', '001_tmp.txt';
            print OUT "$line\n";
            }
}
close(OUT);
close(FILE1);

======================================

澄清: 基本上我想要perl脚本,它等同于以下shell脚本,我可以使用变量来容纳所有文件。

#!/bin/bash 
if [[ $# != 1 ]] 
then 
   echo "Usage: error <input>" 
else 
   echo $# $1 
   export input=$1 
   grep "^chr" $1 > ${input}_tmp.vcf  

2 个答案:

答案 0 :(得分:0)

编辑:您的代码表示批处理文件,表示Windows批处理文件。如果这不是你的意思,请忽略这一点。 : - )

也许是这样的:

从批处理文件:

for /f %%x in (listoffilenames.txt) do (
    perl myperlscript.pl %%x
)

然后你的Perl脚本可以这样修改:

#!/usr/bin/perl
use strict;
use warnings;

# You may want to add a little more error handling 
# around getting the filename, etc.
my $filename = shift or die "No filename specified.";

open (FILE1, "<", $filename) or die ("Can't open file $!");

while(<FILE1>){
        my $line = $_;
        chomp $line;
        if ( $line =~ m/^chr/ ) {
            open OUT, '>>', "temp-$filename";
            print OUT "$line\n";
            }
}
close(OUT);
close(FILE1);

答案 1 :(得分:0)

所以你希望你的while循环读取某个给定目录中的每个文件..

我会做这样的事情:

使用opendirreaddir,以便您可以获取要操作的文件名。

我还会看grep过滤掉你不关心的文件,在我的例子中我过滤掉目录......

opendir(my $dh, $dir) or die "$dir: $!";
my @files = grep { !-d $_ } readdir $dh;
closedir $dh;

现在你将有一个文件列表来处理......

for my $file (@files) {
    open my $fh, "<", $file or die "$!";
    while( my $line = <$fh> ) {
        #TODO: stuff
    }
    close $fh;
}