我想扫描一个长的打印输出,在开始和结束之间获取打印输出的值,如果值不可用,则放置'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发布于 2018-05-15 09:24:46
请您试着跟踪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测试,如果您有更多的条件,那么我们也可以相应地修改它。
发布于 2018-05-15 11:22:08
如果您对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()https://stackoverflow.com/questions/50343739
复制相似问题