2014-07-02 59 views
-1

我有一個大的TXT文件(「」作爲分隔符)的特定字符:大TXT使用awk來提取一些數據和字符串字段

2014:04:29:00:00:58:GMT: subject=BMRA.BM.T_GRIFW-1.FPN, message={SD=2014:04:29:00:00:00:GMT,SP=5,NP=3,TS=2014:04:29:01:00:00:GMT,VP=4.0,TS=2014:04:29:01:29:00:GMT,VP=4.0,TS=2014:04:29:01:30:00:GMT,VP=3.0} 
2014:04:29:00:00:59:GMT: subject=BMRA.BM.T_GRIFW-2.FPN, message={SD=2014:04:29:00:00:00:GMT,SP=5,NP=2,TS=2014:04:29:01:00:00:GMT,VP=3.0,TS=2014:04:29:01:30:00:GMT,VP=3.0} 

我想找到包含「T_GRIFW線',然後從「主題」開始打印$ 1字段,僅打印時間並從$ 2開始浮動。此外,我想包含一個if語句,以便如果字段$ 4 =='NP = 3',只有字段$ 5,$ 6,$ 9,$ 10被打印在前面的字段之後,並且如果$ 4 =='NP = 2'字段印刷(時間和僅浮)

例如,兩個取樣管的結果將是:

subject=BMRA.BM.T_GRIFW-1.FPN,2014:04:29:00:00:00,5,3,2014:04:29:01:00:00,4.0,2014:04:29:01:30:00,3.0 
subject=BMRA.BM.T_GRIFW-2.FPN,2014:04:29:00:00:00,5,2,2014:04:29:01:00:00,3.0,2014:04:29:01:30:00,3.0 

我知道這是複雜的,我已經盡了最大努力,在我的描述透徹。到目前爲止,我的基本代碼是:

awk 'BEGIN {FS=","}{OFS=","} /T_GRIFW-1.FPN/ {print $1}' tib_messages.2014-04-29 

感謝一位!

+0

不多你到目前爲止。更加努力! – hek2mgl

+0

你的輸出沒有意義,因爲它不符合你的條件。你說如果'NP = 3',那麼只有字段$ 5,$ 6,$ 9,$ 10應該打印。 – ooga

+0

嗨Ooga,對於含糊不清,我的意思是後來只有5美元,6美元,9美元,10美元應該打印。 – user2013373

回答

1

下面是要創建所需輸出一個awk可執行文件:

#!/usr/bin/awk -f 

# use a more complicated FS => field numbers counted differently 
BEGIN { FS="=|,"; OFS="," } 

$2 ~ /T_GRIFW/ && $8=="NP" { 
    str="subject=" $2 OFS 

    # strip ":GMT" from dates and "}" from everywhere 
    gsub(/:GMT|[\}]/, "") 

    # append common fields to str with OFS 
    for(i=5;i<=13;i+=2) str=str $i OFS 

    # print the remaining fields and line separator 
    if($9==3) { print str $19, $21 } 
    else if($9==2) { print str $15, $17 } 
} 

放置在一個名爲awko和chmod'ing然後運行awko data收益率:

subject=BMRA.BM.T_GRIFW-1.FPN,2014:04:29:00:00:00,5,3,2014:04:29:01:00:00,4.0,2014:04:29:01:30:00,3.0 
subject=BMRA.BM.T_GRIFW-2.FPN,2014:04:29:00:00:00,5,2,2014:04:29:01:00:00,3.0,2014:04:29:01:30:00,3.0 

我放在評論中的腳本,但這裏有一些東西,可以拼出更好:

  • 使用更復雜的FS意味着你不必重新分析了=與現場數據進行工作
  • 我「騙」,只是硬編碼subject(現在屬於在$1年底)爲str
  • :GMT}似乎是是唯一需要的數據強行拆除
  • 有了這個FS日期和數字兩種彼此分開,但仍環能
  • 在這兩種最終print調用,str已經在OFS結束,所以它與下一個字段之間的逗號可以跳過
+0

我很高興有人在這裏仍然對我們中的一些人非常耐心,他們很難學習繩索!非常感謝n0741337和S. Ahn! – user2013373

0

如果我理解您的需求,下面的工作:

BEGIN { 
    FS="," 
    OFS="," 
} 

/T_GRIFW/ { 
    split($1, subject, " ") 
    result = subject[2] OFS 
    delete arr 
    counter = 1 
    for (i = 2; i <= NF; i++) { 
     add = 0 
     if ($4 == "NP=3") { 
      if (i == 5 || i == 6 || i == 9 || i == 10) { 
       add = 1 
      } 
     } 
     else if ($4 == "NP=2") { 
      add = 1 
     } 

     if (add) { 
      counter = counter + 1 
      split($i, field, "=") 
      if (match(field[2], "[0-9]*\.[0-9]+|GMT")) { 
       arr[counter] = field[2] 
      } 
     } 
    } 

    for (i in arr) { 
     gsub(/{|}/,"", arr[i]) # remove curly braces 
     result = result arr[i] OFS 
    } 
    print substr(result, 0, length(result)-1) 
} 
+0

非常感謝S.安! – user2013373