如何使用跳过线合并文件

时间:2013-05-17 22:59:24

标签: 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 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到“section name”行的行。 f2文件中每行的代码与代码中的代码相同:f1

中的文本对

不知道如何开始,因为

  • 无法使用paste命令,因为我在两个文件中没有相同的行数,并且
  • 无法使用join,因为这两个文件中都不是常用密钥。

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

2 个答案:

答案 0 :(得分: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 $ _ $ \;”形式的每一行 - 所以在每一行之后都会打印输出记录分隔符 - 包含许多换行符的内容。
  • 因此我们得到空行

我希望我的英语能够得到解释。

答案 1 :(得分:1)

或完全在Perl:

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

   print "$_:$suffix";
}