有两个文件:
文件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 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
到“section name”行的行。 f2
文件中每行的代码与代码中的代码相同:f1
不知道如何开始,因为
paste
命令,因为我在两个文件中没有相同的行数,并且join
,因为这两个文件中都不是常用密钥。所以,当有人告诉我一些算法,如何开始时,我会非常高兴 - 我会自己编程。
答案 0 :(得分:3)
我正在为您提供不同的方法 - 我提供了一个代码,您应该弄清楚它是如何工作的;):)
paste -d':' f1 <(perl -pe '$\="\n"x($c=()=/[a-z]+/g)' <f2)
从输入中准确地产生你想要的东西。
编辑 - 说明:
/[a-z]+/g
匹配每个code
并返回$c =()=
是“劳力士运营商” - 允许计算匹配列表的内容$\ = "\n" x NUMBER
- 意味着在x之前重复NUMBER次字符串,例如当有3个代码时,将重复3次“\ n”(换行符)字符。$\
- 输出记录sep。-p
开关按行处理文件并打印“print $ _ $ \;”形式的每一行 - 所以在每一行之后都会打印输出记录分隔符 - 包含许多换行符的内容。我希望我的英语能够得到解释。
答案 1 :(得分:1)
或完全在Perl:
my $skip;
while (<$f1>) {
chomp;
my $suffix;
if ($skip--) {
$suffix = "\n";
} else {
$suffix = <$f2>;
$skip = () = $suffix =~ /[a-z]+/g;
}
print "$_:$suffix";
}