如何通过数据块堆叠文件数据块?

时间:2015-07-19 01:57:00

标签: awk stack cat

我在一个文件夹中有三个文件。

文件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方法也很受欢迎。

谢谢

最好,

1 个答案:

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