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分钟),因为它会对每一行执行三个循环,并拆分该行,在其他文件中找到变量并替换该行
想知道是否有任何方法可以减少循环,以便脚本执行更快。我认为您的两个主要选择是:
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