Bash 解析日志文件可以收集值
我想扫描一个较长的打印输出,并获取打印输出的值 在开始和结束之间,如果值不可用,则输入“NA”。 示例文件如下 我想在Bash Cygwin中这样做Bash 解析日志文件可以收集值,bash,Bash,我想扫描一个较长的打印输出,并获取打印输出的值 在开始和结束之间,如果值不可用,则输入“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
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
请尝试下面的
awk
并告诉我这是否对您有帮助(使用GNUawk
测试)
awk'
/开始/{flag=1}
/结束/{
num=拆分(val_标签,标签“”);
数字=标签[num];
子(/[a-zA-Z]+/,“”,数字);
拆分(val_值,值“”);
对于(i=1;i如果您对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()
欢迎使用Stack Overflow!抱歉,这不是Stack Overflow的工作方式。“我想做X,请给我提示和/或示例代码”表格中的问题被认为是离题的。请访问并阅读,尤其是阅读Hi Kvantour,我对Bash脚本还不熟悉,但有一些知识,所以如果有人能指导我,我会自己做。我需要使用什么的想法。@pawana,没有问题,我们都在这里学习。你可以在这里学习,并通过分享知识让其他人也学习。我有给出一个解决方案,你能试试下面的,让我知道这是否对你有帮助吗?你好Ravinder,它的工作很好!谢谢你的指导/pawana@pawana,很高兴它帮助了您,再次查看此链接如果有人回答了您的问题,我们应该怎么做。干杯,快乐学习:)
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()