如何逐个数据块堆叠文件数据块?

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);
}