Regex Perl:如何在文件中插入行?
我在读两个文件。每当第1列内容匹配时,我尝试在file2和file1之间插入一行 ##文件1 ##文件2 期望输出:Regex Perl:如何在文件中插入行?,regex,perl,Regex,Perl,我在读两个文件。每当第1列内容匹配时,我尝试在file2和file1之间插入一行 ##文件1 ##文件2 期望输出: 1 wr 5769 78670002 fqefq Step1 3 wr 5769 78650003 hfhhg Step3 5 wr 5769 88990001 dfdsv Step5 已尝试的代码: my $rk="rk.log"; open(my $tt, "
1 wr 5769 78670002 fqefq
Step1
3 wr 5769 78650003 hfhhg
Step3
5 wr 5769 88990001 dfdsv
Step5
已尝试的代码:
my $rk="rk.log";
open(my $tt, "<$rk" ) or die "Could not open file $trk: $!";
while (<$tt>) {
if ($_ =~ /^(\d+)\s+wr\s+5769\s+(\w+)\s+\.*/gm) {
open(p1,"<$temp1") or die "Could not open file $temp1: $!";
while (my $newl = <p1>) {
my @fs1 = split " ", $newl;
if ($fs1[0] eq $1){
print "@fs1\n";
print "step $2\n";
} else {
print "@fs1\n";
}
}
}
}
close p1;
close $tt;
希望,一点伪代码就足以让您走上正确的轨道
- 将文件2读入散列(其中键是整数,值是整行)
- 打开文件1
- 一次读取一行文件1
- 打印文件1中的行
- 从line1中的行首提取整数
- 如果该整数存在于散列中
- 打印文件2中的行
use Tie::File;
my $fle1 = $ARGV[0]; my $fle2 = $ARGV[1];
open(FL2, $fle2) || die "Couldn't read file $fle2\: $!\n";
my $flecnt2 = do { local $/; <FL2>; };
close(FL2);
my @array;
tie @array, 'Tie::File', $fle1 || die "Error: Couldn't read and write \"$fle1\" file: $!";
my $str = join "\n", @array;
$str=~s#^([^\s]+)\s(.+)$# my $fulcnt=$&;
if($flecnt2=~m/^$1\s+(.+)$/m)
{
$fulcnt .= "\n$&";
}
($fulcnt);
#egm;
@array = split/\n/, $str;
untie @array;
使用Tie::File;
my$fle1=$ARGV[0];my$fle2=$ARGV[1];
open(FL2,$fle2)| | die“无法读取文件$fle2\:$!\n”;
my$flecnt2=do{local$/;;};
关闭(FL2);
我的@数组;
tie@array,'tie::File',$fle1 | | die“错误:无法读取和写入\“$fle1\”文件:$!”;
my$str=加入“\n”、@array;
$str=~s#^([^\s]+)\s(+.+)$#我的$fulcnt=$&;
如果($flecnt2=~m/^$1\s+(.+)$/m)
{
$fulcnt.=“\n$&”;
}
($fulcnt);
#专家组;
@array=split/\n/,$str;
解开@数组;
如果文件1中存在哈希中的值,则该方法有效。如果我增加文件2中的数字,那么哈希在这里就不起作用了。检查更新部分。Thanks@HG如果在文件2中增加数字,则这些行将不再匹配,根据您的原始条件,这些行将不再插入。@TLP Yes,后来我意识到在某些情况下某些值是递增的。@HG也许你应该更新问题,解释新的条件,并添加合适的测试用例。@HG:老实说,我认为这里的很多问题可能是你实际上并不是100%确定问题的规格。我确信,如果你解决了这个问题,那么你将能够更好地处理它。我的file1有超过10k行,file2有超过500行,所以我认为将这两个文件导入到单独的字符串中并不是一个更好的方法。谢谢。您已经更新了File2,其中没有任何行符合您的原始条件。所以我想你的标准也改变了。如果不知道你的新标准是什么,就不可能提供帮助。
my $rk="rk.log";
open(my $tt, "<$rk" ) or die "Could not open file $trk: $!";
while (<$tt>) {
if ($_ =~ /^(\d+)\s+wr\s+5769\s+(\w+)\s+\.*/gm) {
open(p1,"<$temp1") or die "Could not open file $temp1: $!";
while (my $newl = <p1>) {
my @fs1 = split " ", $newl;
if ($fs1[0] eq $1){
print "@fs1\n";
print "step $2\n";
} else {
print "@fs1\n";
}
}
}
}
close p1;
close $tt;
2 Step1
4 Step3
6 Step5
use Tie::File;
my $fle1 = $ARGV[0]; my $fle2 = $ARGV[1];
open(FL2, $fle2) || die "Couldn't read file $fle2\: $!\n";
my $flecnt2 = do { local $/; <FL2>; };
close(FL2);
my @array;
tie @array, 'Tie::File', $fle1 || die "Error: Couldn't read and write \"$fle1\" file: $!";
my $str = join "\n", @array;
$str=~s#^([^\s]+)\s(.+)$# my $fulcnt=$&;
if($flecnt2=~m/^$1\s+(.+)$/m)
{
$fulcnt .= "\n$&";
}
($fulcnt);
#egm;
@array = split/\n/, $str;
untie @array;