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

Bash 合并两个文件的方法,需要意见,bash,sed,awk,Bash,Sed,Awk,问题:我有两个文件夹(一个是更新文件的增量文件夹,另一个是原始文件所在的原始文件夹)。每次增量文件夹中的文件更新时,我需要将原始文件夹中的文件与增量文件夹中更新的文件合并 注意:虽然增量文件夹和原始文件夹中的文件名是唯一的,但文件中的内容可能不同。例如: $ cat Delta_Folder/1.properties account.org.com.email=New-Email account.value.range=True $ cat Original_Folder/1.properti

问题:我有两个文件夹(一个是更新文件的增量文件夹,另一个是原始文件所在的原始文件夹)。每次增量文件夹中的文件更新时,我需要将原始文件夹中的文件与增量文件夹中更新的文件合并

注意:虽然增量文件夹和原始文件夹中的文件名是唯一的,但文件中的内容可能不同。例如:

$ 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与原始_Folder/1.properties合并,因此,我更新的原始_Folder/1.properties将为:

account.org.com.email=New-Email 
account.value.range=True
range.list.type=String
currency.country=Sweden
我选择的解决方案是:

在Delta文件夹中查找所有*.properties文件,并将列表保存到临时文件(Delta files.txt)

在原始文件夹中查找所有*.properties文件,并将列表保存到临时文件(Original files.txt)

然后我需要得到两个文件夹中唯一的文件列表,并将它们放入循环中

然后我需要循环每个文件以从属性文件(1.properties)读取每一行

然后我需要从delta文件夹的属性文件中读取每一行(delta line=“account.org.com.email=New email”),并用分隔符“=”将该行拆分为两个字符串变量

(delta-line-string1=account.org.com.email;delta-line-string2=新电子邮件;)

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

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

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

对于循环,我使用了循环,对于分割行,我使用了awk,对于替换内容,我使用了sed

尽管它工作得很好,但完成每个文件需要更多的时间(4分钟),因为它会对每一行执行三个循环,并拆分该行,在其他文件中找到变量并替换该行


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

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

  • 用更具特色的语言(如perl)完全重新实现
  • 读取增量文件时,建立一个sed脚本。对于增量文件的每一行,您需要一个类似于以下内容的sed指令:

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

  • 这样,您就不会在原始文件中重复很多次。不要忘记使用
    粘贴
    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对于awk解决方案。如果新文件有以下行:account.comment.box=Hello Therephani:
    awk-F'='“{v=$1;$1=”“;arr[v]=$0}END{for(x in arr){print x”=“arr[x]}}
    (未测试,但应该可以工作)此处没有数据库连接。感谢您的建议,第二个选项看起来是一个很好的开始。事实上,您可以使用sed从增量文件生成sed脚本。
    sed's/^\([^=]*\)=\=(.*))/s#\1=.*.#\1=\2#/“新文件”| sed-f-old_文件
    (看起来很可怕,但对我来说很有用)
    awk -F'=' '{arr[$1]=$2}END{for (x in arr) {print x"="arr[x]}}' /tmp/l2 /tmp/l1