Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl:如何在文件中插入行?_Regex_Perl - Fatal编程技术网

Regex Perl:如何在文件中插入行?

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列内容匹配时,我尝试在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, "<$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中的行

我认为最简单的方法是将两个文件导入到单独的字符串中,然后创建一个循环:

  • 在文件1中查找匹配项。(包括比赛中的换行符)
  • 将匹配项追加到第三个字符串
  • 从文件1中删除匹配项。(替换为“无”)
  • 从文件2中查找匹配项。(包括比赛中的换行符)
  • 将匹配项追加到第三个字符串
  • 从文件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;