2014-07-02 30 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