問題:我有兩個文件夾(一個是增量文件夾 - 文件被更新,另一個是原始文件夾 - 原始文件存在的位置)。每次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分鐘)來完成每個文件,因爲它將進入每個線路的三個循環,並分割線路,並找到其他文件中的變量,並取代線路。
想知道是否有什麼方法可以減少循環,以便腳本執行更快。
感謝您的建議,似乎第二個選項看起來像一個很好的開始。 – phani
實際上,您可以使用sed從增量文件生成sed腳本。 'sed's /^\([^=]*\)=\(.*\)/ s#\ 1 =。*#\ 1 = \ 2#/'new_file | sed -f - old_file'(看起來很可怕,但適用於我) – aragaer