簡體   English   中英

AWK:我有2個輸入文件。 我可以制作1個通用腳本以通過(AWK)獲得CSV格式的輸出嗎?

[英]AWK: I have 2 input files. Can I made 1 common script to get output in a CSV format by (AWK)?

大家好,

我需要處理2個文件(input_all.txt)或(input_deatils.txt),我想通過一個常見的AWK腳本來處理它們。

我嘗試使用腳本(data.awk)獲取表格式CSV的輸出。

如果我嘗試使用如下所示的代碼

        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]=""}
  }

輸入文件可以是以下格式之一。 第一種格式可以如下所示(input_all.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_details.txt)

     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

所需的輸出應如圖所示(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)無法生成輸出。 有人可以幫我糾正和修改代碼嗎?

我不會為您編寫整個程序,但這也許可以幫助您入門。

據我所知,有趣的數據位於標頭和“塞子”之間,並且您想將報表格式轉換為表格,在表格格式中,不重復前導信息。 也就是說,您要在每個部分的第一行上選擇已聲明的Node,並在每行數據的開頭替換它。 並在附近時抑制空白行。 像這樣:

#! /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
}

最后一部分從Node值構造一串空白,並用Node代替。

將其轉換為CSV格式很麻煩,因為awk的正則表達式無法幫助您找到固定偏移量的數據。 我將為此編寫一個單獨的腳本。 如果您使用的是GNU awk,則可能會發現FIELDWIDTHS有幫助。 無論哪種方式,您都必須對列進行計數或使用標題行對其進行計算。 我可能會基於這些偏移量構建一個子字符串數組,並使用OFS =“,”打印該數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM