2016-09-16 8 views
0

Hellowみんな、AWK:2つの入力ファイルがあります。 1つの共通スクリプトを作成して(AWK)CSV形式で出力できますか?

私は(input_all.txt)または(input_deatils.txt)を処理する必要がある2つのファイルがありますが、私は1つの共通AWKスクリプトでそれらを処理したいと思います。

テーブル形式CSVのように出力を取得しようとしたスクリプト(data.awk)。ここで

 awk -f data.awk input_all.txt > output.txt 

    or 

     awk -f data.awk input_details.txt > output.txt 

は、私が使用しようとしたコード(data.awk)で示したように、私は、コードを使用しようとすると

(私はこのコードを修正する助けが必要):

BEGIN { 
      split("Node,Boards,Deactive,DEFAULT,PRIO,GRP,LOAD",array,","); 
      print_array1(array); 
     } 

    /^Node  Boards Deactive/ { getline  
     { while (/^[a-zA-Z0-9]+/ && (NF>1) == 1) 
      { array[1]=(substr($0,1,7)) 
       array[2]=(substr($0,10,7)) 
       array[3]=(substr($0,18,10)) 
       array[4]=(substr($0,34,7)) 
       array[5]=(substr($0,45,9)) 
       array[6]=(substr($0,55,7)) 
       array[6]=(substr($0,64,7)) 
       print_array1(array) 
       getline } 
      } 
     } 

function print_array1(array) 
{ 
    printf("%-9s", array[1]) 
    printf("%-9s", array[2]) 
    printf("%-12s", array[3]) 
    printf("%-9s", array[4]) 
    printf("%-11s", array[5]) 
    printf("%-9s", array[6]) 
    printf("%-5s", array[7]) 
    printf("\n"); 
    #for(item=2;item<=6;item++){array[item]=""} 
    } 

入力ファイルは、次のいずれかの形式にすることができます。 最初のフォーマットはのように示すことができる必要な出力として示すべき

 display:TSTS950 ; 
BOARDS STATES IN NODES 

Node  Boards Deactive  DEFAULT PRIO  GRP  LOAD 
TSTS950 S950 

END 

display:2CGBMW1 ; 
BOARDS STATES IN NODES 

Node  Boards Deactive  DEFAULT PRIO  GRP  LOAD 
2CGBMW1 SXSZ 
      SXSZ 
      SXSZ 
      SXSZ 
      SXSZ 

END 

display:BM311 ; 
BOARDS STATES IN NODES 

Node  Boards Deactive  DEFAULT PRIO  GRP  LOAD 
BM311 BM311 DEACTIVE 

END 

display:BM310 ; 
BOARDS STATES IN NODES 

Node  Boards Deactive  DEFAULT PRIO  GRP  LOAD 
BM310 BM310 DEACTIVE 

END 

display:S850 ; 
BOARDS STATES IN NODES 

Node  Boards Deactive  DEFAULT PRIO  GRP  LOAD 
S850  S850  DEACTIVE 

END 

display:ENA5 ; 
BOARDS STATES IN NODES 

Node  Boards Deactive  DEFAULT PRIO  GRP  LOAD 
ENA5          PER BD S850  10 
                 S852  22 
                 S854  1 
                 T850  17 
                 T851  59 
                 T852  1 
                 2S50  44 
END 

display:SMDRUH; 
BOARDS STATES IN NODES 

Node  Boards Deactive  DEFAULT PRIO  GRP  LOAD 
SMDRUH S852           S852 
      S855           S855 
      S854           S854 
      S857           S857 
      S850 
      S851 
      S856 
      S853 

END 

display:MAINBRD ; 
BOARDS STATES IN NODES 

Node  Boards Deactive  DEFAULT PRIO  GRP  LOAD 
MAINBRD S850     DEFAULT 
      S851 
      S856 
      S853 
      BM310 
      S950 
      T751 
      S855 
      T859 
      S857 
      T851 

END 

第2の入力フォーマットが(Input_details.txt)とすることができる

 display:all; 
BOARDS STATES IN NODES 

Node  Boards Deactive  DEFAULT PRIO  GRP  LOAD 
TSTS950 S950 

2CGBMW1 S854 
      S857 
      S852 
      S855 
      S853 

BM311 BM311 DEACTIVE 

BM310 BM310 DEACTIVE 

ENA5          PER BD S850  10 
                 S852  22 
                 S854  1 
                 T850  17 
                 T851  59 
                 T852  1 
                 2S50  44 

SMDRUH S852           S852 
      S855           S855 
      S854           S854 
      S857           S857 
      S850 
      S851 
      S856 
      S853 

MAINBRD S850      DEFAULT 
      S851 
      S856 
      S853 
      BM310 
      S950 
      T751 
      S855 
      T859 
      S857 
      T851 

END 

(input_all.txt)(output.txtと) 。

Node  Boards Deactive  DEFAULT PRIO  GRP  LOAD 
    TSTS950 S950 
    2CGBMW1 SXSZ 
    2CGBMW1 SXSZ 
    2CGBMW1 SXSZ 
    2CGBMW1 SXSZ 
    2CGBMW1 SXSZ 
    BM311 BM311 DEACTIVE 
    BM310 BM310 DEACTIVE 
    ENA5          PER BD S850  10 
    ENA5          PER BD S852  22 
    ENA5          PER BD S854  1 
    ENA5          PER BD T850  17 
    ENA5          PER BD T851  59 
    ENA5          PER BD T852  1 
    ENA5          PER BD 2S50  44 
    SMDRUH S852           S852 
    SMDRUH S855           S855 
    SMDRUH S854           S854 
    SMDRUH S857           S857 
    SMDRUH S850 
    SMDRUH S851 
    SMDRUH S856 
    SMDRUH S853 
    MAINBRD S850     DEFAULT 
    MAINBRD S851     DEFAULT 
    MAINBRD S856     DEFAULT 
    MAINBRD S853     DEFAULT 
    MAINBRD BM310     DEFAULT 
    MAINBRD S950     DEFAULT 
    MAINBRD T751     DEFAULT 
    MAINBRD S855     DEFAULT 
    MAINBRD T859     DEFAULT 
    MAINBRD S857     DEFAULT 
    MAINBRD T851     DEFAULT 

コード(data.awk)が出力を生成していません。コードを修正して修正するのに助けてくれる人がいますか?

+0

コードが意図していることを説明してください。 – Jdamian

+0

0 @ Jdamian:コードは、(^ノードボードが無効である)と(END)の間の行を見つけようとしています。私たちがそれらを見つけたたびに、第1行が基準線です。レコードごとに$ 1の値を追加します。また、参照線に$ 3、$ 4、$ 5&$ 7が追加されている場合は追加されます。その後、データを列CSV形式にします。 – Tatman

+0

@ Jdamian:コードは、(^ノードボードが無効である)と(END)の間の行を見つけようとしています。私たちがそれらを見つけたたびに、第1行が基準線です。レコードごとに$ 1の値を追加します。また、参照線に$ 3、$ 4、$ 5&$ 7が追加されている場合は追加されます。その後、データを列CSV形式にします。 – Tatman

答えて

0

私はあなたのために全体のプログラムを書くつもりはありませんが、これはあなたが始めるのに役立つかもしれません。

私はこの問題を理解しているので、興味深いデータはヘッダーと "ストッパー"の間にあり、先頭の情報が繰り返されていないレポート形式をそのまま表に変換したいと考えています。つまり、各セクションの1行目で通知されたノードを取得し、各行の先頭に置き換えます。あなたが近所にいる間は空白行を抑止してください。このような何か:

#! /usr/bin/awk -f 

/^Node  Boards Deactive/ { 
    printing = 1 
    print 
    next 
} 

/^END/ { 
    printing = 0 
} 

printing == 1 { 
    printing = 2 
    Node = $1 
    print 
    next 
} 

printing == 2 { 
    leader = Node 
    gsub(/[^ ]/, " ", leader) 
    gsub("^" leader, Node) 
    print 
} 

最後のセクションでは、ノード値からブランクの文字列を構築し、そのためのノードを置換します。

awkの正規表現は固定オフセットでデータを見つけるのに役立たないので、これをCSV形式にするのは面倒です。私はそれのために別のスクリプトを作るだろう。 GNU awkを使用している場合は、FIELDWIDTHSが役に立ちます。いずれにしても、見出しを使用して列を数えたり計算したりする必要があります。私はおそらく、それらのオフセットに基づいて部分配列の配列を作成し、配列をOFS = "、"で印刷します。

+0

@JamesKLowden:ご協力いただきありがとうございます。私はまだ問題があります。スクリプトはファイル(Input_details.txt)のために働くことができます。しかし、入力ファイル(input_all。txt)、スクリプトはノードの最初の値(TSTS950)のみをキャッチします。ファイルの最後まで毎回繰り返してください。関数gsubは、各行でTSTS950の値を繰り返すだけです。これはOKではありません。両方の入力ファイルでスクリプトを実行すると、この点がわかります。入力ファイル(input_all.txt)には、ヘッダーとストッパーの間に多数のノードがあります。今まで、私たちはそれを捕まえられなかった – Tatman

関連する問題