我试图写一个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 ......”但你的意思是'列'?你也有'输入文件'和'输入文件'两个不同,他们对对方有什么参考?你的预期结果是否包含诸如狗和青蛙这些不在原始输入中的词? –