awk匹配如何传递第三个参数

时间:2014-11-10 22:27:46

标签: unix awk gawk

我试图添加第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 个答案:

答案 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"]}'