用于读取文本文件的Perl程序,在文件中搜索文本并将文本复制到新文件

时间:2013-08-30 02:26:24

标签: regex perl

这是一种固定格式,这是我在记事本或ultraedit中打开时看到的内容。这只是一些示例数据,但我的文本文件有大约200,000行和多个目录,就像您在示例中看到的那样。所以基本上我试图将你看到的路径附加到“V:\ word目录”,并在行尾添加“V:\ word”并将其向下复制,直到它看到新的“目录”为止。 V:\ word \ excels“并在事后添加”V:\ word \ excels“,依此类推。你能帮助我,并可能把狗扔出去吗?谢谢,非常感谢!

 Directory of V:\word
04/30/2007  11:49 AM        938,458   BUILTIN\Admin       Filename.pdf
04/06/2012  01:13 PM          3,801   AMERICAS\DoeJ       Filename3.pdf
01/11/2007  12:05 PM         26,624   BUILTIN\Admin       Filename2.doc
08/01/2007  11:57 AM         18,432   BUILTIN\Admin       Filename5.xls
 Directory of V:\word\excels
03/03/2010  10:42 AM         35,840   AMERICAS\DavisF     Billing3-3.xls
02/24/2010  10:31 AM         34,380   AMERICAS\StewartF   Allie2-24.xls

这就是我想要完成的事情

 Directory of V:\word
04/30/2007  11:49 AM        938,458   BUILTIN\Admin       Filename.pdf     V:\word
04/06/2012  01:13 PM          3,801   AMERICAS\DoeJ       Filename3.pdf    V:\word
01/11/2007  12:05 PM         26,624   BUILTIN\Admin       Filename2.doc    V:\word
08/01/2007  11:57 AM         18,432   BUILTIN\Admin       Filename5.xls    V:\word
 Directory of V:\word\excels
03/03/2010  10:42 AM         35,840   AMERICAS\DavisF     Billing3-3.xls   V:\word\excels
02/24/2010  10:31 AM         34,380   AMERICAS\StewartF   Allie.xls        V:\word\excels



这就是我在perl中所拥有的:我仍然陷入困境,但我认为我正在取得一些进展。

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

    open (MYFILE, 'List.txt');
    my $str = " Directory of V:\word";
    while (<MYFILE>)
    {
        chomp;
        ($Date, $Time, $Size, $User, $Filename) = split("\t");
        print $Date, $Time, $Size, $User, $Filename, substr $str,14;

        print "$_\n";
    }
    close (MYFILE);

4 个答案:

答案 0 :(得分:1)

如果您的文件是在stdin上提供的,或者作为参数传递,

@Pichi's one-liner将执行您想要的操作。因为它有点不透明,所以它是以明确的方式做的:

# What's this doing?  perl -lpe'/ Directory of (.*)/?$a=$1:($_.="\t$a")'

my $suffix;                              # Pichi uses $a, a quietly special var I usually avoid

while (defined(my $line = <ARGV>)) {     # Magic ARGV filehandle - stdin or arguments
  chomp($line);                          # Remove newline (-l switch)

  if ($line =~ / Directory of (.*)/) {   # This is the ?: clause
    $suffix = $1;
  } else {
    $line .= "\t$suffix";
  }

  print "$line\n";                       # Print (-p) with newline (-l, again)
}

Perl方便的单行实际上比这更多(例如,$/$\被明确设置,print被错误检查),但这基本上是方法

答案 1 :(得分:0)

为什么不用awk?

awk '/ Directory of /{at=$3;print;next}{print $0""FS""at}' your_file

的Perl:

perl -lne 'if(/ Directory of (.*)/){$a=$1;print}else{$_.="\t".$a;print}' your_file

如果你想进行内联替换:

perl -i -lne 'if(/ Directory of (.*)/){$a=$1;print}else{$_.="\t".$a;print}' your_file

答案 2 :(得分:0)

如果你想使用Perl脚本(很好的机会了解它):

首先,为了写入一个新文件,您需要打开两个文件:FILE1将是您要读取信息的文件,FILE2是您要编写的文件。所以,打开第一个&#34;阅读&#34;选项(&#39;&lt;&#39;)和第二个&#34;写&#34;选项(&#39;&gt;&#39;)。更多信息。关于'openfile' here

然后,当您使用&#34; WHILE&#34;我建议你把每个句子都放在一个变量中......

while ($line =<$file1>) 
{    ... 
     ...
}

...并且取决于(info. about 'if statement')句子的开头('regular expressions')执行动作/打印或其他操作。

要打印句子末尾的目录,请在变量中保留包含目录信息(&#39; if&#39;)的行。您还可以使用有用的正则表达式消除您不感兴趣的句子部分。 (又名&#39;正则表达式&#39;)。

容易......; - )

答案 3 :(得分:0)

简短而简单:

perl -lpe'/ Directory of (.*)/?$a=$1:($_.="\t$a")'