2

有两个文件:

文件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

不知道如何开始,因为

  • 无法使用该paste命令,因为我在两个文件中的行数不同,并且
  • 不能使用join,因为这两个文件中都没有公共键。

所以,当有人告诉我一些算法,如何开始时,我会很高兴——我会自己编程。

4

2 回答 2

3

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

paste -d':' f1 <(perl -pe '$\="\n"x($c=()=/[a-z]+/g)' <f2)

从您的输入中准确地产生您想要的东西。

编辑 - 说明:

  • 灵魂来自您的评论,这些行仅包含代码和数字。因此,可以轻松地从线路中获取代码。
  • 因此,在每行之后输入尽可能多的空行 - 你有多少代码
  • /[a-z]+/g匹配的每个code并返回它们
  • $c =()=是“劳力士运营商” - 允许计算匹配列表
  • 匹配代码的数量给出了需要多少空行的数量
  • - 表示在$\ = "\n" x NUMBER`x 之前重复 NUMBER 次字符串,例如当有 3 个代码时,将重复 3 次“\n”(换行符)字符。
  • 换行符被添加到变量$\- 输出记录 sep。
  • 并且因为-p交换机逐行处理文件并以“print $_$\;”的形式打印每一行 - 所以在每一行之后都会打印输出记录分隔符 - 其中包含许多换行符。
  • 因此我们得到空行

我希望我的英语足以解释。

于 2013-05-17T23:13:41.757 回答
1

或者完全在 Perl 中:

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

   print "$_:$suffix";
}
于 2013-05-18T02:14:10.247 回答