0

问题:我有两个文件夹(一个是 Delta 文件夹 - 文件更新的地方,另一个是原始文件夹 - 原始文件存在的地方)。每次 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

现在,我需要将 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"),并将带有分隔符“=”的行拆分为两个字符串变量。

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

然后我需要从原始文件夹的属性文件中读取每一行(orig-line=account.org.com.email=Old-Email 并用分隔符“=”将行拆分为两个字符串变量。

(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

一旦循环完成查找文件中的所有行,它就会转到下一个文件。循环继续,直到完成文件夹中的所有唯一文件。

对于循环,我使用for循环,对于分割线,我使用awk,而对于替换内容,我使用sed

总的来说,它的工作正常,它需要更多的时间(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

我认为您的两个主要选择是:

  1. 用更有特色的语言完全重新实现它,比如 perl。
  2. 在读取 delta 文件时,构建一个 sed 脚本。对于 delta 文件的每一行,您需要一个类似于以下内容的 sed 指令:

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

这样,您就不会在原始文件中循环播放很多次。不要忘记逃避 & / 和 \ 如this answer中所述。

于 2012-06-28T21:47:23.673 回答