2013-05-17 79 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"; 
}