0

問題: 2 つのフォルダーがあります (1 つはファイルが更新されるデルタ フォルダーで、もう 1 つは元のファイルが存在するオリジナル フォルダーです)。デルタ フォルダーのファイルが更新されるたびに、元のフォルダーのファイルをデルタ フォルダーの更新されたファイルとマージする必要があります。

注: 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

ここで、Delta_Folder/1.properties を Original_Folder/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) に保存します。

Original-Folder 内のすべての *.properties ファイルを検索し、リストを一時ファイル (original-files.txt) に保存します。

次に、両方のフォルダーで一意のファイルのリストを取得し、それらをループに入れる必要があります。

次に、各ファイルをループして、プロパティ ファイル (1.properties) から各行を読み取る必要があります。

次に、delta-folder のプロパティ ファイルから各行 (delta-line="account.org.com.email=New-Email") を読み取り、その行を区切り記号 "=" で 2 つの文字列変数に分割する必要があります。

(delta-line-string1=account.org.com.email; delta-line-string2=New-Email;)

次に、original-folder のプロパティ ファイルから各行 (orig-line=account.org.com.email=Old-Email) を読み取り、その行を区切り文字「=」で 2 つの文字列変数に分割する必要があります。

(orig-line-string1=account.org.com.email; orig-line-string2=Old-Email;)

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を使用しました。

すべての行で3つのループに入り、行を分割し、他のファイルで変数を見つけて行を置き換えるため、すべての作業がうまくいき、各ファイルを完了するのに時間がかかります(4分)。

スクリプトがより速く実行されるように、ループを減らす方法があるかどうか疑問に思っています。

4

3 に答える 3

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

または、並べ替えが重要でない場合は、単一のawkコマンドを使用します。

awk -F'=' '{arr[$1]=$2}END{for (x in arr) {print x"="arr[x]}}' /tmp/l2 /tmp/l1
于 2012-06-28T21:50:55.110 に答える
0

ここでデータベースを使用するオプションはありますか?

次に、Deltaファイルからデータを抽出するためのコードを記述するだけで済みます(データベース接続で置き換えることができないと仮定します)。

時間が経つにつれて、これはますます複雑になり、遅くなるようです。

于 2012-06-29T00:30:12.400 に答える
0

あなたの2つの主なオプションは次のとおりだと思います。

  1. これを perl のような機能豊富な言語で完全に再実装します。
  2. 差分ファイルを読みながら、sed スクリプトを作成します。デルタ ファイルの各行に対して、次のような sed 命令が必要です。

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

そうすれば、元のファイルを何度もループすることはありません。この回答に記載されているように、&/ と \ をエスケープすることを忘れないでください。

于 2012-06-28T21:47:23.673 に答える