2011-06-29 20 views
1

我有以下需要得到良好的bash程序員一些幫助

#!/bin/bash 
function labels2() { 
    awk ' 
    /[0-9]/{ 
    print substr($3,length($3)-11), $3 
    }' [email protected] | /bin/sort -u | awk '{print "BUILD: " NR, $2}' 
} 

function labels() { 
    awk ' 
    /[0-9]/{ 
    BL[$3] = substr($3,length($3)-11) 
    } 
    END { 
    asort(BL) 
    for (i in BL) { 
     print i, BL[i] 
    } 
    }' [email protected] 
} 


labels [email protected] 

for a in [email protected] 
do 
    labels [email protected] | gawk ' 
    /BUILD:/ { 
    BUILD[$2] = $3 
    BUILDCNT ++ 
    next 
    } 
    /[0-9]/ { 
    DATEd[$3] = $1 
    TIMEd[$3] = $2 
    MODULESd[$3] = $4 
    CASESd[$3] = $5 
    FAILEDd[$3] = $6 
    COVERd[$3] = $7 
    LOCd[$3] = $8 
    } 
    END { 
    SUBSYSTEM=substr(FILENAME, 1, length(FILENAME)-7) 
    LABEL= "\"" toupper(SUBSYSTEM) "\"" 

    print "#{" 
     print "\"buildnames\": {" 
     print "  \"label\": \"buildnames\"," 
     print "  \"data\": [" 

     print "  ]" 
     print " }" 
     print "};" 
     print "#{" 
     print "\"subsystem\": " LABEL "," 
     print " \"date\": {" 
     print "  \"label\": " LABEL "," 
     print "  \"data\": [" 
     for (i = 0 ; i <= BUILDCNT; i ++) { 
      B=BUILD[i] 
      if (DATEd[B]) { print "   [" i ", \"" DATEd[B] "\"],"} 
     } 
     print "  ]" 
     print " }," 
     print " \"time\" : {" 
     print "  \"label\": " LABEL "," 
     print "  \"data\": [" 
     for (i = 0 ; i <= BUILDCNT; i ++) { 
      B=BUILD[i] 
      if (TIMEd[B]) { print "   [" i ", \"" TIMEd[B] "\"],"} 
     } 
     print "  ]" 
     print " }," 
     print " \"modules\" : {" 
     print "  \"label\": " LABEL "," 
     print "  \"data\": [" 
     for (i = 0 ; i <= BUILDCNT; i ++) { 
      B=BUILD[i] 
      if (MODULESd[B]) { print "   [" i ", \"" MODULESd[B] "\"],"} 
     } 
     print "  ]" 
     print " }," 
     print " \"cases\" : {" 
     print "  \"label\": " LABEL "," 
     print "  \"data\": [" 
     for (i = 0 ; i <= BUILDCNT; i ++) { 
      B=BUILD[i] 
      if (MODULESd[B]) { print "   [" i ", \"" MODULESd[B] "\"],"} 
     } 
     print "  ]" 
     print " }," 
     print " \"failed\" : {" 
     print "  \"label\": " LABEL "," 
     print "  \"data\": [" 
     for (i = 0 ; i <= BUILDCNT; i ++) { 
      B=BUILD[i] 
      if (FAILEDd[B]) { print "   [" i ", \"" FAILEDd[B] "\"],"} 
     } 
     print "  ]" 
     print " }," 
     print " \"cover\" : {" 
     print "  \"label\": " LABEL "," 
     print "  \"data\": [" 
     for (i = 0 ; i <= BUILDCNT; i ++) { 
      B=BUILD[i] 
      if (COVERd[B]) { print "   [" i ", \"" COVERd[B] "\"],"} 
     } 
     print "  ]" 
     print " }," 
     print " \"loc\" : {" 
     print "  \"label\": " LABEL "," 
     print "  \"data\": [" 
     for (i = 0 ; i <= BUILDCNT; i ++) { 
      B=BUILD[i] 
      if (LOCd[B]) { print "   [" i ", \"" LOCd[B] "\"],"} 
     } 
     print "  ]" 
     print " }" 
     print " };" 
    } 
    ' - $a 
done 

這個腳本,它提供了以下輸出時「feeded」與當前的文本文件gps.txt

2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
_ 




1 110114072915 
#{ 
"buildnames": { 
     "label": "buildnames", 
     "data": [ 
     ] 
     } 
}; 
#{ 
"subsystem": "GPS", 
    "date": { 
     "label": "GPS", 
     "data": [ 
      [0, "1"], 
     ] 
    }, 
     "time" : { 
     "label": "GPS", 
     "data": [ 
      [0, "110114072915"], 
     ] 
    }, 
     "modules" : { 
     "label": "GPS", 
     "data": [ 
     ] 
    }, 
     "cases" : { 
     "label": "GPS", 
     "data": [ 
     ] 
    }, 
     "failed" : { 
     "label": "GPS", 
     "data": [ 
     ] 
    }, 
     "cover" : { 
     "label": "GPS", 
     "data": [ 
     ] 
    }, 
     "loc" : { 
     "label": "GPS", 
     "data": [ 
     ] 
    } 
    }; 

我想要的樣子是這樣的

#{ 
"buildnames": { 
     "label": "buildnames", 
     "data": [[0,"BUILD: 1 P16A22_110114072915"] 
     ] 
     } 
}; 
#{ 
"subsystem": "GPS", 
    "date": { 
     "label": "GPS", 
     "data": [ 
      [0, "2011-01-22"], 
     ] 
    }, 
     "time" : { 
     "label": "GPS", 
     "data": [ 
      [0, "22:12"], 
     ] 
    }, 
     "modules" : { 
     "label": "GPS", 
     "data": [[0,22] 
     ] 
    }, 
     "cases" : { 
     "label": "GPS", 
     "data": [[0,1312] 
     ] 
    }, 
     "failed" : { 
     "label": "GPS", 
     "data": [[0,75] 
     ] 
    }, 
     "cover" : { 
     "label": "GPS", 
     "data": [[0,13.55] 
     ] 
    }, 
     "loc" : { 
     "label": "GPS", 
     "data": [[0,1399] 
     ] 
    } 
    }; 

所以把這個問題分解成子問題

  1. 爲什麼行1 110114072915在頂部,我該如何刪除它?

  2. 我如何使用功能labels2(),使得從它(BUILD: 1 P16A22_110114072915)輸出會在buildnames這樣

    "buildnames": { 
        "label": "buildnames", 
        "data": [[0,"**BUILD: 1 P16A22_110114072915**"] 
        ] 
        } 
    
  3. 這是最後一個問題:爲什麼不這項工作MODULESd[$3] = $4CASESd[$3] = $5等......當我循環並打印出來時,它就變成了什麼。

請注意這裏,該文本文件gps.txt將不斷擴大,因此,在未來它可能是50行,這將是一件好事,如果sollution仍然會工作=)

我知道這成了很多文本,我爲此道歉,而且我可能無法就所有問題得到答案,但是如果您可能有一個想法如何實現其中的任何一個,我會更加高興,因爲我目前被卡住了並不知道如何去做我想做的事情。不幸的是,這種做法是我唯一的選擇。

感謝你的努力=)

+1

我幾乎不知道你在問什麼。 – zellio

+0

我試圖將使用bash腳本將struckture「Date Time Build Modules cases failed cover loc」中的文本文件轉換爲JSON到JSON中,但遇到了麻煩 – johannes

+2

這是一個非常具體的問題,並且包含所有該文本並且幾乎沒有任何有關的知識'gps.txt'很難說明這裏出了什麼問題。我建議你把這個程序分解成幾部分,看你的個人功能是否正常。這是一個非常長的調試過程,您必須自己做。 :) –

回答

1

這是所有基於心理過程 - 我還沒有真正運行的命令呢。這將有助於看到該文本文件的示例

1)爲什麼行1 110114072915在頂部,我該如何刪除它?

它看起來像循環打印信息之前的光禿labels [email protected]調用。擺脫這一點。

2)您可能應該將該邏輯遷移到底部的awk命令中。關聯數組分配可以在第二個塊/[0-9]/中完成,而END邏輯可以直接放入大腳本的END塊中。

3)文本文件每行有8個字段嗎?作爲調試,使用類似print NF > "/dev/stderr";的東西來確保在設置變量時確實有8個字段。

0

1)爲什麼行1 110114072915在頂部,我該如何刪除它?

Foo Bah正確回答了這個問題。

這看起來我錯了:

for a in [email protected] 
do 
labels [email protected] | gawk ' 

你爲什麼要遍歷所有的ARGS,然後運行labels [email protected]labels $a

2)如何可以使用函數標籤2()

我將運行功能並分配輸出到AWK變量:

labels [email protected] | gawk -v "bnames=\"$(labels $a)\"" ' 

然後使用在該變量awk腳本:

print "  \"data\": [", bnames 

3)這是最後一個問題:爲什麼不工作

我不知道,但你永遠不會知道,除非你將問題分解成小塊並自行調試。如果你寫了一百行的awk腳本,並且它不起作用,答案是嘗試讓一個簡單的十行版本起作用,然後逐漸增大它並檢查每個部分的工作情況。