我想扫描长打印输出并获取打印输出的值 如果值不可用,则在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
答案 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进行测试,然后我们也必须相应地更改它。