问题:我有两个文件夹(一个是Delta文件夹 - 文件得到更新,另一个是原始文件夹 - 原始文件存在的位置)。每次在Delta文件夹中更新文件时,我都需要将Original文件夹中的文件与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)。
找到原始文件夹中的所有* .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;)
然后我需要从orginal-folder的属性文件中读取每一行(orig-line = account.org.com.email = Old-Email,并将带有分隔符“=”的行拆分为两个字符串变量。< / p>
(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 的内容。
在所有工作正常的情况下,它花费更多的时间(4分钟)来完成每个文件,因为它进入每个行的三个循环并分割线并在其他文件中找到变量并替换该行。
想知道是否有任何方法可以减少循环,以便脚本执行得更快。
答案 0 :(得分:1)
paste
和awk
:
文件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
答案 1 :(得分:0)
我认为你的两个主要选择是:
在阅读增量文件时,请构建一个sed脚本。对于delta文件的每一行,您需要一个类似于:
的sed指令s/account.org.com.email=.*$/account.org.email=value_from_delta_file/g
这样你就不会多次遍历原始文件了。别忘了逃避&amp; /和\,如this answer中所述。
答案 2 :(得分:0)
在这里选择使用数据库吗?
然后,您只需要编写用于从Delta文件中提取数据的代码(假设不能用数据库连接替换)。
随着时间的推移,这似乎会变得越来越复杂和缓慢。