2012-06-28 35 views
0

問題:我有兩個文件夾(一個是增量文件夾 - 文件被更新,另一個是原始文件夾 - 原始文件存在的位置)。每次Delta文件夾中的文件更新時,我都需要將原始文件夾中的文件與Delta文件夾中的更新文件合併。合併兩個文件的方法,需要的意見

說明:儘管Delta文件夾和Original文件夾中的文件名是唯一的,但文件中的內容可能不同。例如:

$ cat Delta_Folder/1.properties 
account.org.com.email=New-Email 
account.value.range=True 

$ cat Original_Folder/1.properties 
account.org.com.email=Old-Email 
account.value.range=False 
range.list.type=String 
currency.country=Sweden 

現在,我需要合併與Original_Folder Delta_Folder/1.properties/1.properties所以,我更新Original_Folder/1.properties將是:

account.org.com.email=New-Email 
account.value.range=True 
range.list.type=String 
currency.country=Sweden 

解決方案,我選擇是:

找到Delta-Folder中的所有* .properties文件並將列表保存到臨時文件(delta-files.txt)。

找到所有的*原始卷宗.properties文件和列表保存到臨時文件(原始files.txt)

然後我需要獲得的兩個文件夾中唯一的文件列表,並把那些在循環中。

然後我需要循環每個文件從屬性文件(1.properties)中讀取每一行。

然後我需要從delta文件夾的屬性文件中讀取每一行(delta-line =「account.org.com.email = New-Email」),並將行分隔符「=」分成兩部分字符串變量。

(Δ-行字符串1 = account.org.com.email;Δ-線字符串2 =新的電子郵件;)

然後我需要讀取每一行(原稿行= account.org。 com.mail =舊電子郵件從原始文件夾的屬性文件,並將行分隔符「=」分成兩個字符串變量。

(orig-line-string1 = account.org.com.email; orig -line-字符串2 =舊的電子郵件;)

if delta-line-string1 == orig-line-string1 then update $orig-line with $delta-line 
i.e: 
if account.org.com.email == account.org.com.email then replace 

account.org.com.email=Old-Email in original folder/1.properties with 

account.org.com.email=New-Email 

一旦循環結束查找文件中的所有行,然後將其轉到下一個文件的循環續直到它完成文件夾中的所有獨特文件。

對於循環我用環路,用於分割線我用AWK及更換內容我用sed的

在其所有工作正常,其花費更多的時間(4分鐘)來完成每個文件,因爲它將進入每個線路的三個循環,並分割線路,並找到其他文件中的變量,並取代線路。

想知道是否有什麼方法可以減少循環,以便腳本執行更快。

回答

0

我覺得你的兩個主要選擇是:

  1. 在更多的其他功能的語言完全重寫本,如Perl。
  2. 在讀取增量文件時,建立一個sed腳本。對於增量文件的每一行,你想類似於SED指令:

    s/account.org.com.email=.*$/account.org.email=value_from_delta_file/g 
    

你不遍歷原始文件一堆額外時間的方式。不要忘記逃避& /和\,如this answer中所述。

+0

感謝您的建議,似乎第二個選項看起來像一個很好的開始。 – phani

+0

實際上,您可以使用sed從增量文件生成sed腳本。 'sed's /^\([^=]*\)=\(.*\)/ s#\ 1 =。*#\ 1 = \ 2#/'new_file | sed -f - old_file'(看起來很可怕,但適用於我) – aragaer

1

隨着pasteawk

文件2:

$ cat /tmp/l2 
account.org.com.email=Old-Email 
account.value.range=False 
currency.country=Sweden 
range.list.type=String 

文件1:

$ cat /tmp/l1 
account.org.com.email=New-Email 
account.value.range=True 

命令+輸出:

paste /tmp/l2 /tmp/l1 | awk '{print $NF}' 
account.org.com.email=New-Email 
account.value.range=True 
currency.country=Sweden 
range.list.type=String 

或Wi日單awk命令,如果排序並不重要:

awk -F'=' '{arr[$1]=$2}END{for (x in arr) {print x"="arr[x]}}' /tmp/l2 /tmp/l1 
+0

粘貼解決方案很有吸引力,但依賴於輸入中的順序是一致的,並且不允許任何字段被跳過。爲awk解決方案+1。 –

+0

如果新文件包含以下內容,該怎麼辦:account.comment.box = Hello There – phani

+0

phani:'awk -F'=''{v = $ 1; $ 1 =「」; arr [v] = $ 0} END {for x in arr){print x「=」arr [x]}}''(未測試,但應該可以) –

0

在這裏所有的選項使用數據庫?

然後,您只需編寫用於從Delta文件中提取數據的代碼(假設不能由數據庫連接替代)。

隨着時間的推移,它似乎會變得越來越複雜,越來越慢。

+0

這裏沒有數據庫連接。 – phani