如何逐个数据块堆叠文件数据块?
How to stack up the files datablock by datablock?
我在一个文件夹中有三个文件。
文件A有700行,由100个数据块组成。每个数据块有 5 行。第一行是每个数据块的总行数,第二行是空的,第三~七行是数据。
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)
文件B与A类似,但有一点不同。它总共有 300 行,由 100 个数据块组成,每个数据块有 3 行
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)
文件C也类似。总共400行,由100个数据块组成,每个数据块有4行
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 个文件逐个数据块地堆叠成单个文件。所以结果总共有 1200 行,由 100 个数据块组成,每个数据块有 12 行,应该看起来像
12
AA 356djs 225gsd 1245gr
BB 123asd 123asd 123asd
CC TToptg TToptg gngngn
DD sIG123 gjn123 uot123
EE 166131 100021 205011
LL lplplp 122121 aggagg
KK hbnkio ohgimp 125125
TT KGNskg fgnjdg 125154
PP ginini 216361 sgdaga
ZZ gonhon q215ag hagqgq
RR TKEMMM 125sdg 125961
II tninks 150121 192u9u
12
AA 356djs 225gsd 1245gr
BB 123asd 123asd 123asd
CC TToptg TToptg gngngn
DD sIG123 gjn123 uot123
EE 166131 100021 205011
LL lplplp 122121 aggagg
KK hbnkio ohgimp 125125
TT KGNskg fgnjdg 125154
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 方法。
谢谢
最佳,
这是用于堆叠块的 Perl 代码。它暂时将 $/ (记录分隔符)重新定义为两个连续的新行,因此每个空行都开始一个新段落。然后它从三个文件中的每一个中读取每个段落(块)并写入输出。
#!/usr/bin/env perl
# Usage: [=10=] <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 ( == 12 && ($. != 1) ) {
print E $_, "\n";
}
} elsif ( !($_ =~ /^\s*$/) ) {
print E $_;
}
}
close(D2);
close(E);
}
我在一个文件夹中有三个文件。
文件A有700行,由100个数据块组成。每个数据块有 5 行。第一行是每个数据块的总行数,第二行是空的,第三~七行是数据。
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)
文件B与A类似,但有一点不同。它总共有 300 行,由 100 个数据块组成,每个数据块有 3 行
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)
文件C也类似。总共400行,由100个数据块组成,每个数据块有4行
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 个文件逐个数据块地堆叠成单个文件。所以结果总共有 1200 行,由 100 个数据块组成,每个数据块有 12 行,应该看起来像
12
AA 356djs 225gsd 1245gr
BB 123asd 123asd 123asd
CC TToptg TToptg gngngn
DD sIG123 gjn123 uot123
EE 166131 100021 205011
LL lplplp 122121 aggagg
KK hbnkio ohgimp 125125
TT KGNskg fgnjdg 125154
PP ginini 216361 sgdaga
ZZ gonhon q215ag hagqgq
RR TKEMMM 125sdg 125961
II tninks 150121 192u9u
12
AA 356djs 225gsd 1245gr
BB 123asd 123asd 123asd
CC TToptg TToptg gngngn
DD sIG123 gjn123 uot123
EE 166131 100021 205011
LL lplplp 122121 aggagg
KK hbnkio ohgimp 125125
TT KGNskg fgnjdg 125154
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 方法。
谢谢
最佳,
这是用于堆叠块的 Perl 代码。它暂时将 $/ (记录分隔符)重新定义为两个连续的新行,因此每个空行都开始一个新段落。然后它从三个文件中的每一个中读取每个段落(块)并写入输出。
#!/usr/bin/env perl
# Usage: [=10=] <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 ( == 12 && ($. != 1) ) {
print E $_, "\n";
}
} elsif ( !($_ =~ /^\s*$/) ) {
print E $_;
}
}
close(D2);
close(E);
}