用于从目录中的所有文本文件中删除第一行的脚本

时间:2012-02-29 23:06:27

标签: perl

我正在尝试编写一个Perl脚本,该脚本读取目录中的所有文本文件,并将除第一行之外的所有行写入单独的文件。如果有3个文件,我希望脚本读取所有这3个文件并写入3个除第一个之外的相同行的新文件。这就是我写的..但是当我尝试运行脚本时,它执行正常,没有错误,但没有做它应该做的工作。有人可以调查一下吗?

opendir (DIR, "dir\\") or die "$!";
my @files = grep {/*?\.txt/}  readdir DIR;
close DIR;
my $count=0;
my $lc;
foreach my $file (@files) {
   $count++;
   open(FH,"dir\\$file") or die "$!";
   $str="dir\\example_".$count.".txt";
   open(FH2,">$str");
   $lc=0;
   while($line = <FH>){
        if($lc!=0){
            print FH2 $line;
        }
        $lc++;
    }
   close(FH);
   close(FH2);
}

第二个文件不存在,应该由脚本创建。

3 个答案:

答案 0 :(得分:1)

如果您有文件列表......

foreach my $file ( @files ) {
  open my $infile , '<' , "dir/$file" or die "$!" ;
  open my $outfile , '>' , "dir/example_" . ++${counter} . '.txt' or die "$!" ;
  <$infile>; # Skip first line.
  while( <$infile> ) {
    print $outfile $_ ;
  }
}

当超出范围时,词法文件句柄将自动关闭。

答案 1 :(得分:1)

尝试更改这些行

opendir (DIR, "dir\\") or die "$!";
...
close DIR;

opendir (DIR, "dir") or die "$!";
...
closedir DIR;

我尝试在本地运行你的代码,我遇到的唯一两个问题是包含尾部斜杠的目录名,并尝试在dirhandle上使用filehandle close()函数。

答案 2 :(得分:0)

不确定为什么你在这里使用$ count,因为这只会变成一个文件列表,如:

01.txt
bob.txt
alice.txt
02.txt

成:

01_1.txt
bob_2.txt
alice_3.txt
02_4.txt

请记住,@ files没有被排序,因此它将按照目录表中文件的顺序返回。如果您要删除并重新创建文件01.txt,它将被移动到列表的末尾,重新排序整个集:

bob_1.txt
alice_2.txt
02_3.txt
01_4.txt

由于这不是原始问题的真正原因,因此您完全按照要求行事:

#!/usr/bin/perl
while(<*.txt>) { # for every file in the *.txt glob from the current directory
    open(IN, $_) or die ("Cannot open $_: $!"); # open file for reading
    my @in = <IN>; # read the contents into an array
    close(IN); # close the file handle
    shift @in; # remove the first element from the array

    open(OUT, ">$_.new") or die ("Cannot open $_.new: $!"); # open file for writing
    print OUT @in; # write the contents of the array to the file
    close(OUT); # close the file handle
}