我需要像A.ini和B.ini这样的文件,我想合并A.ini
中的两个文件examples of files:
A.ini::
a=123
b=xyx
c=434
B.ini contains:
a=abc
m=shank
n=paul
my output in files A.ini should be like
a=123abc
b=xyx
c=434
m=shank
n=paul
我希望在perl语言中进行此合并,并且我希望将旧A.ini文件的副本保留在其他位置以使用旧副本
答案 0 :(得分:1)
命令行变体:
perl -lne '
($a, $b) = split /=/;
$v{$a} = $v{$a} ? $v{$a} . $b : $_;
END {
print $v{$_} for sort keys %v
}' A.ini B.ini >NEW.ini
答案 1 :(得分:0)
怎么样:
#!/usr/bin/perl
use strict;
use warnings;
my %out;
my $file = 'path/to/A.ini';
open my $fh, '<', $file or die "unable to open '$file' for reading: $!";
while(<$fh>) {
chomp;
my ($key, $val) = split /=/;
$out{$key} = $val;
}
close $fh;
$file = 'path/to/B.ini';
open my $fh, '<', $file or die "unable to open '$file' for reading: $!";
while(<$fh>) {
chomp;
my ($key, $val) = split /=/;
if (exists $out{$key}) {
$out{$key} .= $val;
} else {
$out{$key} = $val;
}
}
close $fh;
$file = 'path/to/A.ini';
open my $fh, '>', $file or die "unable to open '$file' for writing: $!";
foreach(keys %out) {
print $fh $_,'=',$out{$_},"\n";
}
close $fh;
答案 2 :(得分:0)
要合并的两个文件可以一次读取,不需要被视为单独的源文件。这允许使用<>
读取在命令行上作为参数传递的所有文件。
保留A.ini
的备份副本只是在将合并数据写入同名新文件之前重命名。
此程序似乎可以满足您的需求。
use strict;
use warnings;
my $file_a = $ARGV[0];
my (@keys, %values);
while (<>) {
if (/\A\s*(.+?)\s*=\s*(.+?)\s*\z/) {
push @keys, $1 unless exists $values{$1};
$values{$1} .= $2;
}
}
rename $file_a, "$file_a.bak" or die qq(Unable to rename "$file_a": $!);
open my $fh, '>', $file_a or die qq(Unable to open "$file_a" for output: $!);
printf $fh "%s=%s\n", $_, $values{$_} for @keys;
输出(在A.ini
)
a=123abc
b=xyx
c=434
m=shank
n=paul