解析日志文件可以收集值

时间:2018-05-15 06:37:23

标签: bash

我想扫描长打印输出并获取打印输出的值 如果值不可用,则在START和END之间加上'NA'。 示例文件如下。

我想在Bash Cygwin中这样做。

logfile.txt:

START

label1 label2 label3
valueA valueB valueC

label4 label5
valueD valueE

label6
valueF

END

START

label1 label3
valueG valueH

label6
valueI

END

START

label1
valueJ

label6
valueK

END

想要的output.txt在

之下
valueA valueB valueC valueD valueE valueF
valueG NA     valueH NA     NA     valueI
valueJ NA     NA     NA     NA     valueK

2 个答案:

答案 0 :(得分:1)

如果您对python代码感兴趣:

with open("testfile.txt","r") as tt, open("output.txt","w") as op:
    lnums = []
    values =[]
    for ll in tt:
        if(ll.split()):

            if(ll.split()[0]=="START"):
                lnums = []
                values =[]

            elif(ll.split()[0]=="END"):
                max = lnums[-1]
                j=0
                for i in range(max):
                    if(lnums[j]==i+1):
                        op.write(values[j]+" ")
                        j=j+1
                    else:
                        op.write("NA ")
                op.write("\n")

            else:
                if("label" in ll):
                    labels = ll.split()
                    lnums = lnums + [int(x[5:]) for x in labels] #extract number from label

                elif("value" in ll):
                    values = values + ll.split()

答案 1 :(得分:0)

请问您可以尝试关注awk并告诉我这是否对您有所帮助(使用GNU awk进行测试)。

awk '
/START/{  flag=1  }
/END/{
   num=split(val_label,label," ");
   digit=label[num];
   sub(/[a-zA-Z]+/,"",digit);
   split(val_value,value," ");
   for(i=1;i<=digit;i++){
      sub(/[a-zA-Z]+/,"",label[i]);
      k=i;
      if(i!=label[i]){
         while(k<label[i]){  na=na?na OFS "NA":"NA";k++  };
      value[i]=na OFS value[i]};
   na=k=""};
   for(l=1;l<=digit;l++){  printf("%s%s",value[l],l==digit?ORS:OFS)  };
   delete label;
   delete value;
   val_value=val_label=""
}
flag && /label/{  val_label=val_label?val_label OFS $0:$0  }
flag && /value/{  val_value=val_value?val_value OFS $0:$0  }
'    Input_file

注意: 如果您有更多条件,则使用示例Input_file进行测试,然后我们也必须相应地更改它。