我試圖寫一個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.
請務必在代碼中使用'strict strict'和'use warnings'來捕獲拼寫錯誤和其他問題,並在向其他人顯示幫助時縮進代碼。這樣很難閱讀。你可以[編輯]你的問題。 – simbabque
狗和貓從哪裏來?您的示例輸入中沒有這些。很難遵循你的代碼應該做的事情。這篇文章的解釋牆不是很清楚。文件列表中的「文字」部分是什麼意思?它們是相關的,還是隻需要數字就可以得到正確的界限? – simbabque
盡我所能幫忙,這不是很清楚。你說你想「需要'行1,2 ......」但你的意思是'列'?你也有'輸入文件'和'輸入文件'兩個不同,他們對對方有什麼參考?你的預期結果是否包含諸如狗和青蛙這些不在原始輸入中的詞? –