Perl 如何合并带跳行的文件
有两个文件: 文件f1的下一个结构位于文件中不存在的注释之后Perl 如何合并带跳行的文件,perl,bash,awk,Perl,Bash,Awk,有两个文件: 文件f1的下一个结构位于文件中不存在的注释之后 SomeText1 #Section name - one word [a-zA-Z] acd:some text #code:text - the code contains only [a-z] opo:some another text #variable number of code:text pairs wed:text too #in the
SomeText1 #Section name - one word [a-zA-Z]
acd:some text #code:text - the code contains only [a-z]
opo:some another text #variable number of code:text pairs
wed:text too #in the SomeText1 section are 3 pairs
SomeText2
xxx:textttt #here only 1 code:text pair
SomeText3
zzz:texxxxxxx #here only 1 code:text pair too
和文件f2中包含的内容,其顺序与上述文件相同,下一行:
1000:acd:opo:wed:123.44:4545.23:1233.23 #3 codes - like in the above segment 1
304:xxx:10:11:12.12 #1 code - these lines contains only
4654:zzz:0 #codes and numbers
所需输出为
SomeText1:1000:acd:opo:wed:123.44:4545.23:1233.23
acd:some text:
opo:some another text:
wed:text too:
SomeText2:304:xxx:10:11:12
xxx:textttt:
SomeText3:4654:zzz:0
zzz:texxxxxxx:
因此需要将f2中的行添加到节名称行。f2文件中每一行中的代码与f1中代码:文本对中的代码相同
不知道怎么开始,因为
无法使用“粘贴”命令,因为两个文件中的行数不相同,并且
无法使用join,因为这两个文件中没有公用键。
所以,如果有人告诉我一些算法,如何开始,我会非常高兴。我将为您提供不同的方法。我提供一个代码,您应该知道它是如何工作的;
paste -d':' f1 <(perl -pe '$\="\n"x($c=()=/[a-z]+/g)' <f2)
从您的输入中准确地生成您想要的内容
编辑-解释:
答案来自您的注释,行中只包含代码和数字。因此,可以很容易地从线路中获取代码。
因此,在每行之后输入足够多的空行-您有多少代码
/[a-z]+/g匹配每个代码并返回它们
$c==是劳力士操作员-什么允许计算匹配列表
匹配代码的计数给出了需要多少空行的数字
$\=\n x NUMBER-mean repeat NUMBER乘以`x之前的字符串,例如,当有3个代码时,将重复\n换行符3次。
换行符被添加到variabe$\-output记录sep中。
由于-p开关按行处理文件,并以print$\u$\;的形式打印每一行所以每行之后都会打印输出记录分隔符-其中包含多个换行符。
因此我们得到了空行
我希望我的英语足够解释。我为您提供了不同的方法-我提供了一个代码,您应该知道它是如何工作的;:
paste -d':' f1 <(perl -pe '$\="\n"x($c=()=/[a-z]+/g)' <f2)
从您的输入中准确地生成您想要的内容
编辑-解释:
答案来自您的注释,行中只包含代码和数字。因此,可以很容易地从线路中获取代码。
因此,在每行之后输入足够多的空行-您有多少代码
/[a-z]+/g匹配每个代码并返回它们
$c==是劳力士操作员-什么允许计算匹配列表
匹配代码的计数给出了需要多少空行的数字
$\=\n x NUMBER-mean repeat NUMBER乘以`x之前的字符串,例如,当有3个代码时,将重复\n换行符3次。
换行符被添加到variabe$\-output记录sep中。
由于-p开关按行处理文件,并以print$\u$\;的形式打印每一行所以每行之后都会打印输出记录分隔符-其中包含多个换行符。
因此我们得到了空行
我希望我的英语足够好解释。或者完全用Perl:
my $skip;
while (<$f1>) {
chomp;
my $suffix;
if ($skip--) {
$suffix = "\n";
} else {
$suffix = <$f2>;
$skip = () = $suffix =~ /[a-z]+/g;
}
print "$_:$suffix";
}
或者完全使用Perl:
my $skip;
while (<$f1>) {
chomp;
my $suffix;
if ($skip--) {
$suffix = "\n";
} else {
$suffix = <$f2>;
$skip = () = $suffix =~ /[a-z]+/g;
}
print "$_:$suffix";
}
什么这就是编写代码的意义所在。我强烈建议你自己试试。什么?这就是编写代码的意义所在。我强烈建议您自己尝试一下。运行perl生成的文件中有空行a,行数与f1相同,因此可以粘贴。Perlvar说$\是输出行分隔符,/[a-z]+//g与代码匹配。剩下的不太清楚但它是有效的,所以接受并感谢你@卡吉酒太棒了。您只需要将其发送出去,尽管您显然不知道它是如何工作的。这真的很可爱,而且很简单。运行perl生成的文件中有空行a,并且具有与f1相同的行数,因此可以进行粘贴。Perlvar说$\是输出行分隔符,/[a-z]+//g与代码匹配。剩下的不太清楚但它是有效的,所以接受并感谢你@卡吉酒太棒了。你只是想把它运出去,尽管你显然不知道它是怎么工作的。这真的很可爱。