我在一个文件夹中有三个文件。
文件A有700行,由100个数据块组成。每个数据块有5行。第一行具有每个数据块的总行数,第二行为空,第3行为数据。
public function images(){
return $this->hasMany('App\Image');
}
文件B与A类似,但有点不同。它总共有300行,由100个数据块组成,每个数据块有3行
5
AA 356djs 225gsd 1245gr
BB 123asd 123asd 123asd
CC TToptg TToptg gngngn
DD sIG123 gjn123 uot123
EE 166131 100021 205011
5
AA 356djs 225gsd 1245gr
BB 123asd 123asd 123asd
CC TToptg TToptg gngngn
DD sIG123 gjn123 uot123
EE 166131 100021 205011
.... (repeating until 100th data block)
文件C也类似。总共400行,由100个数据块组成,每个数据块有4行
3
LL lplplp 122121 aggagg
KK hbnkio ohgimp 125125
TT KGNskg fgnjdg 125154
3
LL lplplp 122121 aggagg
KK hbnkio ohgimp 125125
TT KGNskg fgnjdg 125154
.... (repeating until 100th data block)
我希望通过datablock将这3个文件堆叠到单个文件datablock中。因此结果总共有1200行,由100个数据块组成,每个数据块有12行,应该看起来像
4
PP ginini 216361 sgdaga
ZZ gonhon q215ag hagqgq
RR TKEMMM 125sdg 125961
II tninks 150121 192u9u
4
PP ginini 216361 sgdaga
ZZ gonhon q215ag hagqgq
RR TKEMMM 125sdg 125961
II tninks 150121 192u9u
.... (repeating until 100th data block)
如果它完全堆叠了3个文件,那很容易,因为我可以使用cat命令。但这是不同的......我如何通过每个数据块来堆叠文件,如上例所示?我可以使用awk命令或cat命令吗? Fortran或python方法也很受欢迎。
谢谢
最好,
答案 0 :(得分:1)
这是用于堆叠块的Perl代码。它暂时将$ /(记录分隔符)重新定义为两个连续的新行,因此每个空行开始一个新段落。然后它从三个文件中的每一个读取每个段落(块)并写入输出。
#!/usr/bin/env perl
# Usage: $0 <File A> <File B> <File C> <Output File>
StackEm();
CleanUp();
sub StackEm
{
# Within this function, temporarily redefine $/ for paragraph mode
local $/ = "\n\n";
my $line;
open(A, "< $ARGV[0]");
open(B, "< $ARGV[1]");
open(C, "< $ARGV[2]");
open(D1, "> temp1");
# Read a block from each of the files and write it to output
for (my $i=0; $i < 100; $i++) {
$line = <A>;
print D1 "12\n";
print D1 $line;
$line = <B>;
print D1 $line;
$line = <C>;
print D1 $line;
}
close(A);
close(B);
close(C);
close(D1);
}
sub CleanUp
{
open(D2, "< temp1");
open(E, "> $ARGV[3]");
while (<D2>) {
if ( /^\s*(\d+)\s*$/ ) {
if ( $1 == 12 && ($. != 1) ) {
print E $_, "\n";
}
} elsif ( !($_ =~ /^\s*$/) ) {
print E $_;
}
}
close(D2);
close(E);
}