2013-05-17 44 views
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中的行添加到“section name”行中。在f2文件的每一行代码都是相同的代码进行:在f1

文本对有没有不知道如何下手,因为

  • 不能使用paste命令,因为我没有在两个文件中具有相同的行数,并且
  • 不能使用join,因为这两个文件中都不是通用键。

所以,当有人告诉我某些算法,如何开始 - 我将自己编程,这样会很开心。

+0

什么?这是编写代码的关键。我强烈建议你自己尝试一下。 – chrsblck

回答

3

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

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

产生正是你从你输入想要什么。

编辑 - 说明:

  • 的soultion来自您的评论行只包含代码和号码。因此可以很容易地从线上获取代码。
  • 每行之后,因此足以进入尽可能多的空行 - 你有多少代码具有
  • /[a-z]+/g匹配每一个code并返回它们
  • $c =()=是“劳力士操作” - 是什么让数匹配
  • 名单
  • 匹配代码的数量给出了需要多少空行的数量
  • $\ = "\n" x NUMBER - 平均重复NUMBER乘以“x”之前的字符串的数量,例如当有3个代码时,会重复3次“\ n”(换行符)。
  • 换行符被添加到变量$\ - 输出记录sep。
  • ,因为-p开关按行处理文件并以“print $ _ $ \;”的形式打印每一行。 - 每行后都会打印输出记录分隔符 - 包含一些换行符。因此
  • 我们得到空行

我希望比我的英语足够好了解释。

+0

运行perl会生成空行a的文件,并具有与'f1'相同的行数,因此可以进行粘贴。 Perlvar说$ \是输出行分隔符,'/ [a-z] +/g'与'codes'匹配。其余不是很清楚.. :(但它是行之有效的,所以接受并感谢你:) – cajwine

+0

@cajwine那真棒。即使你很清楚不知道它是如何工作的,你仍然会“运送”它。 – chrsblck

+0

这真的很可爱,很适合。 –

1
在Perl

或全部:

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

    print "$_:$suffix"; 
}