2017-08-22 86 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

非常感謝,克里斯特納。這個工作很有魅力。如果你曾經在澳大利亞悉尼,請給我打電話。我欠你幾杯啤酒。乾杯! –