Am trying to add a 3rd column/argument to achieve my output. In the below data/string I would like to add the "type" to my existing output
我试图添加第3列/参数来实现我的输出。在下面的数据/字符串中,我想在现有输出中添加“type”
Data:
<field name="AVERAGE_TIME" type="float" id="0xDZZ" sequence="1"/>
Present working script
FILE="$1"
awk -F[=\ ] 'BEGIN{OFS="|" }
/context/{cn=$3}
/field/{match($0,"id=[^ ]+"); idstart = RSTART+3; idlen=RLENGTH-3;
match($0,"name=[^ ]+"); namestart=RSTART+5; namelen=RLENGTH-5;
print substr($0,namestart, namelen), substr($0,idstart, idlen),cn
}' "../$FILE" | sed 's/\"//g'
Present Output
AVERAGE_TIME|0xDZZ|temp
What I would like to see (type added)
AVERAGE_TIME|0xDZZ|temp|float
2 个解决方案
#1
0
Here's how you'd modify your original script to do what you need. Here's the unchanged part:
以下是您修改原始脚本以执行所需操作的方法。这是未改变的部分:
FILE="$1"
awk -F[=\ ] 'BEGIN{OFS="|" }
/context/{cn=$3}
/field/{match($0,"id=[^ ]+"); idstart = RSTART+3; idlen=RLENGTH-3;
match($0,"name=[^ ]+"); namestart=RSTART+5; namelen=RLENGTH-5;
Now, we add an addditional line and modify the print:
现在,我们添加一个附加行并修改print:
match($0,"type=[^ ]+"); typestart=RSTART+5; typelen=RLENGTH-5
print substr($0,namestart, namelen), substr($0,idstart, idlen),cn,substr($0,typestart,typelen)
}' "../$FILE" | sed 's/\"//g'
Just a note, awk is not a good solution for xml-parsing and your awk script isn't the best way of doing it either. Here's a slightly-cleaner solution, if you really need to use awk here (I just copied your context stuff verbatim here):
只是注意,awk不是一个很好的xml解析解决方案,你的awk脚本也不是最好的方法。这里有一个稍微清洁的解决方案,如果你真的需要在这里使用awk(我只是在这里逐字复制你的上下文):
cat $FILE |
awk 'BEGIN{OFS="|" }
/context/{cn=$3} ## i just copied this verbatim from your script
/^<field/ && NF>3 {delete x;
for (i=1; i<=NF; i++) {
match($i, /^(.*?)=\"(.*?)\"$/, arr);
if (1 in arr && 2 in arr) { x[arr[1]] = arr[2];}
};
print x["name"], x["id"], cn, x["type"]}'
#2
2
$ awk -F'"' -v OFS='|' '{print $2, $6, "temp", $4}' file
AVERAGE_TIME|0xDZZ|temp|float
If that doesn't do what you want then please edit your question to clarify your requirements and add some more truly representative sample input and expected output.
如果这不符合您的要求,那么请编辑您的问题以阐明您的要求,并添加一些更真实的代表性样本输入和预期输出。
#1
0
Here's how you'd modify your original script to do what you need. Here's the unchanged part:
以下是您修改原始脚本以执行所需操作的方法。这是未改变的部分:
FILE="$1"
awk -F[=\ ] 'BEGIN{OFS="|" }
/context/{cn=$3}
/field/{match($0,"id=[^ ]+"); idstart = RSTART+3; idlen=RLENGTH-3;
match($0,"name=[^ ]+"); namestart=RSTART+5; namelen=RLENGTH-5;
Now, we add an addditional line and modify the print:
现在,我们添加一个附加行并修改print:
match($0,"type=[^ ]+"); typestart=RSTART+5; typelen=RLENGTH-5
print substr($0,namestart, namelen), substr($0,idstart, idlen),cn,substr($0,typestart,typelen)
}' "../$FILE" | sed 's/\"//g'
Just a note, awk is not a good solution for xml-parsing and your awk script isn't the best way of doing it either. Here's a slightly-cleaner solution, if you really need to use awk here (I just copied your context stuff verbatim here):
只是注意,awk不是一个很好的xml解析解决方案,你的awk脚本也不是最好的方法。这里有一个稍微清洁的解决方案,如果你真的需要在这里使用awk(我只是在这里逐字复制你的上下文):
cat $FILE |
awk 'BEGIN{OFS="|" }
/context/{cn=$3} ## i just copied this verbatim from your script
/^<field/ && NF>3 {delete x;
for (i=1; i<=NF; i++) {
match($i, /^(.*?)=\"(.*?)\"$/, arr);
if (1 in arr && 2 in arr) { x[arr[1]] = arr[2];}
};
print x["name"], x["id"], cn, x["type"]}'
#2
2
$ awk -F'"' -v OFS='|' '{print $2, $6, "temp", $4}' file
AVERAGE_TIME|0xDZZ|temp|float
If that doesn't do what you want then please edit your question to clarify your requirements and add some more truly representative sample input and expected output.
如果这不符合您的要求,那么请编辑您的问题以阐明您的要求,并添加一些更真实的代表性样本输入和预期输出。