0

这是一种固定格式,当我在记事本或 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

4 回答 4

1

如果您的文件在标准输入上给出或作为参数传递, @Pichi 的单线将执行您想要的操作。由于它有点不透明,因此它以明确的方式执行以下操作:

# 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被错误检查),但本质上就是这种方法。

于 2013-08-30T17:36:59.960 回答
0

简短而简单:

perl -lpe'/ Directory of (.*)/?$a=$1:($_.="\t$a")'
于 2013-08-30T07:04:02.553 回答
0

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

首先,为了写入一个新文件,您需要打开两个文件:FILE1 是您要读取信息的文件,FILE2 是您要写入的文件。所以,用“阅读”选项('<')打开第一个,用“写作”选项('>')打开第二个。更多信息。关于“openfile”这里

然后,当您使用“WHILE”时,我建议您将每个句子放在一个变量中......

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

...并根据(关于“if语句”的信息)句子的开头(“正则表达式”)执行操作/打印或其他操作。

要在句子末尾打印目录,请将带有目录信息 ('if') 的行也保留在变量中。您还可以使用有用的“正则表达式”(又名“正则表达式”)消除句子中您不感兴趣的部分。

简单的 ... ;-)

于 2013-08-30T06:50:35.017 回答
0

为什么不awk?

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

珀尔:

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
于 2013-08-30T06:40:40.793 回答