2015-07-19 63 views
0

我在一個文件夾中有三個文件。如何通過數據塊堆疊文件數據塊?

文件A有700行,由100個數據塊組成。每個數據塊有5行。第一行有每個數據塊的總行數,第二行是空的,第3-7行是數據。

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方法也是受歡迎的。

由於

最佳,

回答

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

我只對perl有限的想法,但我從這段代碼得到了一個提示。我用fortran 90 THanks完成了編碼 – exsonic01