我试图添加第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
答案 0 :(得分:2)
$ awk -F'"' -v OFS='|' '{print $2, $6, "temp", $4}' file
AVERAGE_TIME|0xDZZ|temp|float
如果那样做不符合您的要求,请编辑您的问题以澄清您的要求,并添加一些更具真实代表性的样本输入和预期输出。
答案 1 :(得分:0)
以下是修改原始脚本以执行所需操作的方法。这是未改变的部分:
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:
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'
只是注意,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"]}'