合并两个文件的方法,需要的意见

时间:2012-06-28 21:36:06

标签: bash sed awk

问题:我有两个文件夹(一个是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分钟)来完成每个文件,因为它进入每个行的三个循环并分割线并在其他文件中找到变量并替换该行。

想知道是否有任何方法可以减少循环,以便脚本执行得更快。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

  1. 用更有用的语言完全重新实现这一点,比如perl。
  2. 在阅读增量文件时,请构建一个sed脚本。对于delta文件的每一行,您需要一个类似于:

    的sed指令
    s/account.org.com.email=.*$/account.org.email=value_from_delta_file/g
    
  3. 这样你就不会多次遍历原始文件了。别忘了逃避&amp; /和\,如this answer中所述。

答案 2 :(得分:0)

在这里选择使用数据库吗?

然后,您只需要编写用于从Delta文件中提取数据的代码(假设不能用数据库连接替换)。

随着时间的推移,这似乎会变得越来越复杂和缓慢。