这是一种固定格式,这是我在记事本或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);
答案 0 :(得分:1)
@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")'