我有2个文件,一个是主文件,另一个是此文件的子集,还有一些其他数据。这两个文件都是带有^ A分隔符的字段形式。我的工作是,从主文件,我希望创建子集文件。子集文件已经有一些数据,我可以复制,但我希望主文件中可用的字段也可以在子文件中使用。
示例:
subset file format:
1234^A56^A78^A910^A1112^A13^A14^A151617^A18^A192021.000000^A22.000000
master file format:
1242^A2282^A2^A1^A0
1234^A78^A910^A4^A4
1380^A2594^A2^A25^A3
1404^A2447^A6^A44^A9
在上面的示例中,主文件有4行,而子文件有1行。主文件的第2行的值与子文件中的行匹配。
我想在主文件中创建其他行,也是子集文件。基本上,子集文件中的第一个,第三个和第四个字段应该与主文件的前3个字段匹配,其余字段可以是任意随机生成的值。
另外,我希望在子文件中保留^ A分隔符。
答案 0 :(得分:2)
假设您要将所有记录附加到同一子集文件,请使用
#! /usr/bin/perl -l
use warnings;
use strict;
# demo only
my $buf = join "" =>
map "$_\n" =>
"1242\cA2282\cA2\cA1\cA0",
"1234\cA78\cA910\cA4\cA4",
"1380\cA2594\cA2\cA25\cA3",
"1404\cA2447\cA6\cA44\cA9";
open my $master, "+<", \$buf or die "$0: open: $!";
open my $subset, ">>", "subset.dat" or die "$0: open: $!";
while (<$master>) {
chomp;
my($id,$x,$y) = (split /\cA/)[0..2];
print $subset join "\cA" =>
$id, 56, $x, $y,
1112, 13, 14, 151617, 18, 192021.000000, 22.000000;
}
close $subset or warn "$0: close: $!";
如perlop中所述,转义序列\cA
生成您正在使用的 Ctrl-A (ASCII SOH)分隔符。为了保持演示自包含,上面的代码读取$buf
就好像它是一个文件一样,但当然你要在生产中打开主文件。
通过less
查看的输出再次用粗体 ^ A 表示ASCII SOH:
1242^A56^A2282^A2^A1112^A13^A14^A151617^A18^A192021^A22 1234^A56^A78^A910^A1112^A13^A14^A151617^A18^A192021^A22 1380^A56^A2594^A2^A1112^A13^A14^A151617^A18^A192021^A22 1404^A56^A2447^A6^A1112^A13^A14^A151617^A18^A192021^A22
答案 1 :(得分:0)
这会回答你的问题吗?