Perl 如何合并带跳行的文件

Perl 如何合并带跳行的文件,perl,bash,awk,Perl,Bash,Awk,有两个文件: 文件f1的下一个结构位于文件中不存在的注释之后 SomeText1 #Section name - one word [a-zA-Z] acd:some text #code:text - the code contains only [a-z] opo:some another text #variable number of code:text pairs wed:text too #in the

有两个文件:

文件f1的下一个结构位于文件中不存在的注释之后

SomeText1                #Section name - one word [a-zA-Z]
acd:some text            #code:text - the code contains only [a-z]
opo:some another text    #variable number of code:text pairs
wed:text too             #in the SomeText1 section are 3 pairs
SomeText2
xxx:textttt              #here only 1 code:text pair
SomeText3
zzz:texxxxxxx            #here only 1 code:text pair too
和文件f2中包含的内容,其顺序与上述文件相同,下一行:

1000:acd:opo:wed:123.44:4545.23:1233.23    #3 codes - like in the above segment 1
304:xxx:10:11:12.12                        #1 code - these lines contains only 
4654:zzz:0                                 #codes and numbers
所需输出为

SomeText1:1000:acd:opo:wed:123.44:4545.23:1233.23
acd:some text:
opo:some another text:
wed:text too:
SomeText2:304:xxx:10:11:12
xxx:textttt:
SomeText3:4654:zzz:0
zzz:texxxxxxx:
因此需要将f2中的行添加到节名称行。f2文件中每一行中的代码与f1中代码:文本对中的代码相同

不知道怎么开始,因为

无法使用“粘贴”命令,因为两个文件中的行数不相同,并且 无法使用join,因为这两个文件中没有公用键。
所以,如果有人告诉我一些算法,如何开始,我会非常高兴。我将为您提供不同的方法。我提供一个代码,您应该知道它是如何工作的;

paste -d':' f1 <(perl -pe '$\="\n"x($c=()=/[a-z]+/g)' <f2)
从您的输入中准确地生成您想要的内容

编辑-解释:

答案来自您的注释,行中只包含代码和数字。因此,可以很容易地从线路中获取代码。 因此,在每行之后输入足够多的空行-您有多少代码 /[a-z]+/g匹配每个代码并返回它们 $c==是劳力士操作员-什么允许计算匹配列表 匹配代码的计数给出了需要多少空行的数字 $\=\n x NUMBER-mean repeat NUMBER乘以`x之前的字符串,例如,当有3个代码时,将重复\n换行符3次。 换行符被添加到variabe$\-output记录sep中。 由于-p开关按行处理文件,并以print$\u$\;的形式打印每一行所以每行之后都会打印输出记录分隔符-其中包含多个换行符。 因此我们得到了空行
我希望我的英语足够解释。

我为您提供了不同的方法-我提供了一个代码,您应该知道它是如何工作的;:

paste -d':' f1 <(perl -pe '$\="\n"x($c=()=/[a-z]+/g)' <f2)
从您的输入中准确地生成您想要的内容

编辑-解释:

答案来自您的注释,行中只包含代码和数字。因此,可以很容易地从线路中获取代码。 因此,在每行之后输入足够多的空行-您有多少代码 /[a-z]+/g匹配每个代码并返回它们 $c==是劳力士操作员-什么允许计算匹配列表 匹配代码的计数给出了需要多少空行的数字 $\=\n x NUMBER-mean repeat NUMBER乘以`x之前的字符串,例如,当有3个代码时,将重复\n换行符3次。 换行符被添加到variabe$\-output记录sep中。 由于-p开关按行处理文件,并以print$\u$\;的形式打印每一行所以每行之后都会打印输出记录分隔符-其中包含多个换行符。 因此我们得到了空行 我希望我的英语足够好解释。

或者完全用Perl:

my $skip;
while (<$f1>) {
   chomp;
   my $suffix;
   if ($skip--) {
      $suffix = "\n";
   } else {
      $suffix = <$f2>;
      $skip = () = $suffix =~ /[a-z]+/g;
   }

   print "$_:$suffix";
}
或者完全使用Perl:

my $skip;
while (<$f1>) {
   chomp;
   my $suffix;
   if ($skip--) {
      $suffix = "\n";
   } else {
      $suffix = <$f2>;
      $skip = () = $suffix =~ /[a-z]+/g;
   }

   print "$_:$suffix";
}

什么这就是编写代码的意义所在。我强烈建议你自己试试。什么?这就是编写代码的意义所在。我强烈建议您自己尝试一下。运行perl生成的文件中有空行a,行数与f1相同,因此可以粘贴。Perlvar说$\是输出行分隔符,/[a-z]+//g与代码匹配。剩下的不太清楚但它是有效的,所以接受并感谢你@卡吉酒太棒了。您只需要将其发送出去,尽管您显然不知道它是如何工作的。这真的很可爱,而且很简单。运行perl生成的文件中有空行a,并且具有与f1相同的行数,因此可以进行粘贴。Perlvar说$\是输出行分隔符,/[a-z]+//g与代码匹配。剩下的不太清楚但它是有效的,所以接受并感谢你@卡吉酒太棒了。你只是想把它运出去,尽管你显然不知道它是怎么工作的。这真的很可爱。