首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析日志文件可以收集值。

解析日志文件可以收集值。
EN

Stack Overflow用户
提问于 2018-05-15 06:37:23
回答 2查看 45关注 0票数 1

我想扫描一个长的打印输出,在开始和结束之间获取打印输出的值,如果值不可用,则放置'NA‘。示例文件如下。

我想在Bash Cygwin做这件事。

代码语言:javascript
复制
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在下面

代码语言:javascript
复制
valueA valueB valueC valueD valueE valueF
valueG NA     valueH NA     NA     valueI
valueJ NA     NA     NA     NA     valueK
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-15 09:24:46

请您试着跟踪awk,并告诉我这是否对您有帮助(用GNU awk测试)。

代码语言:javascript
复制
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测试,如果您有更多的条件,那么我们也可以相应地修改它。

票数 0
EN

Stack Overflow用户

发布于 2018-05-15 11:22:08

如果您对python代码感兴趣,那么:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50343739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档