2017-08-22 50 views
-1
写输出

我试图写一个Perl脚本执行以下操作:重复记录在Perl

我有一个包含文件列表的文件名为“Filelist.txt中”(即FILE1.TXT,文件2 .txt等), 以及包含需要读取的数值的列&用于更新每个文件中对应的 行。

注意:所有文件都是制表符分隔的。

Filelist.txt中(输入)

​​

每个文件有 'X' 的行数:

FILE1.TXT(输入)

1 dogs word2 word3 
2 word1 word2 word3 
3 cats word2 word3 
4 word1 word2 word3 
5 frog word2 word3 

我需要做的是什么阅读“filelist.txt”中的第1列以获取文件名(即file1.txt)。然后阅读第2列以获取行号(即1.word,3.word,5.word)。一旦有行号,我需要打开“file1.txt”,并且对于与从“filelist.txt”中提取的数字相匹配的每行号,打印“file1.txt”中的每一行(如下所示) ,其中从“filelist.txt”提取的数字与“file1.txt”中的行数相匹配。在这个例子中,来自“1.dogs”的“1”匹配第1行,来自“3.cats”的“3”匹配第“3”行,来自“5.frog”的“5”匹配第“5”行。这需要为“filelist.txt”中的每个文件完成。

file1.tmp(输出)输出所需(基于文件Filelist.txt中)

<strike>1</strike> <strike>dogs</strike> <strike>word2</strike> <strike>word3</strike> 
2 word1 word2 word3 
<strike>3</strike> <strike>cats</strike> <strike>word2</strike> <strike>word3</strike> 
4 word1 word2 word3 
<strike>5</strike> <strike>frog</strike> <strike>word2</strike> <strike>word3</strike> 

file1.txt needs rows 1, 3, 5 to be updated. 2, 4 stay as is. 
file2.txt needs row 2 to be updated. 1, 3, 4, 5 stay as is. 
file3.txt needs rows 4, 5 to be updated. 1, 2, 3. 
file4.txt needs rows 3, 4, 5 to be updated. 1, 2 stay as is. 
file5.txt needs row 4 to be updated. 1, 2, 3, 5 stay as is. 

SCRIPT

use Cwd; 
$dir = getcwd; 

$nofile = "FILE NOT FOUND"; 
$strike = "<>"; 
$tab = " "; 
my $filelist = "filelist.list"; 

open INFILE, "$dir/$filelist" or die "$nofile\n"; 

while (my $line=<INFILE>) 
{ 
    chomp($line); 
    my ($filename, $rownum) = split /\t/, $line; 

    @rowarray = split(/, /, $rownum); 
    my $arraysize = @rowarray; 

    open INFILE2, "$dir/$filename" or die "$nofile\n"; 
    $filename =~ s/.txt//; 
    $tmpfilename = $filename; 
    open (OUTFILE, ">$dir/$tmpfilename.tmp"); 

    while (my $line2=<INFILE2>) 
    { 
     chomp ($line2); 
     my ($fn, $col1, $col2, $col3) = split (/\t/, $line2); 

     for ($i = 0; $i < $arraysize; $i++) 
     { 
     $scratched = $rowarray[$i]; 
     my ($substring2) = $scratched =~ /(.*)?\./; 

     if ($substring2 == $fn) 
     { 
      print "Match: $substring2 == $fn\n\n"; 
      print OUTFILE "$strike$fn$strike$tab$strike$col1$strike$tab$strike$col2$strike$tab$strike$col3$strike\n"; 
     } 
     elsif ($substring2 != $fn) 
     { 
      print "No match: $substring2 != $fn\n\n"; 
      print OUTFILE "$fn$tab$col1$tab$col2$tab$col3\n"; 
     } 
     } 
    } 
} 
close (INFILE); 
close (INFILE2); 
close (OUTFILE); 

的电流值(从FILE1.TXT输入)

<>1<> <>dogs<> <>word2<> <>word3<> 
1 dogs word2 word3 
1 dogs word2 word3 
2 word1 word2 word3 
2 word1 word2 word3 
2 word1 word2 word3 
3 cats word2 word3 
<>3<> <>cats<> <>word2<><>word3<> 
3 cats word2 word3 
4 word1 word2 word3 
4 word1 word2 word3 
4 word1 word2 word3 
5 frog word2 word3 
5 frog word2 word3 
<>5<> <>frog<> <>word2<> <>word3<> 

一直在这几天,不幸的是,我不能看到如何得到这个正常工作。

任何建议/帮助将不胜感激。

预先感谢您。

比利J.

+3

请务必在代码中使用'strict strict'和'use warnings'来捕获拼写错误和其他问题,并在向其他人显示帮助时缩进代码。这样很难阅读。你可以[编辑]你的问题。 – simbabque

+1

狗和猫从哪里来?您的示例输入中没有这些。很难遵循你的代码应该做的事情。这篇文章的解释墙不是很清楚。文件列表中的“文字”部分是什么意思?它们是相关的,还是只需要数字就可以得到正确的界限? – simbabque

+0

尽我所能帮忙,这不是很清楚。你说你想“需要'行1,2 ......”但你的意思是'列'?你也有'输入文件'和'输入文件'两个不同,他们对对方有什么参考?你的预期结果是否包含诸如狗和青蛙这些不在原始输入中的词? –

回答

0

的问题是,你要比较每行的阵列中的每个成员,并输出到临时文件,如果它匹配或不那么你最终与各行的多个副本。修复代码的最简单的解决方案是让变量追踪是否获得匹配,并且一旦在for循环之外,就可以适当地打印该行。

my $match = 0; 
    for ($i = 0; $i < $arraysize; $i++) 
    { 
    $scratched = $rowarray[$i]; 
    my ($substring2) = $scratched =~ /(.*)?\./; 

    if ($substring2 == $fn) 
    { 
     print "Match: $substring2 == $fn\n\n"; 
     $match = 1; 
     last; # No need checking the rest of the array at this point 
    } 
    else # elsif was overkill - it'll either match or not 
    { 
     print "No match: $substring2 != $fn\n\n"; 
    } 
    } 
    if ($match) 
    { 
    print OUTFILE "$strike$fn$strike$tab$strike$col1$strike$tab$strike$col2$strike$tab$strike$col3$strike\n"; 
    } else { 
    print OUTFILE "$fn$tab$col1$tab$col2$tab$col3\n"; 
    } 
+0

非常感谢,克里斯特纳。这个工作很有魅力。如果你曾经在澳大利亚悉尼,请给我打电话。我欠你几杯啤酒。干杯! –