我有一个XML文件,其中包含一组这样的条目:
<attr name="trajectory" value="nodo2"/>
我想要做的是用文件的每个条目中的值字段替换格式为“nodoR”的随机字符串,其中R是在max_R和min_R之间选择的整数。我的问题是这是否可以使用awk。
我坚持以下内容:
awk '/"trajectory"/ {sub(/"nodo[0-9]"/,"nodoR")}1' $XML_FILE
对于前一行,我将用相同的值“nodoR”替换所有“node [0-9]”值。这不是我想要的,我想要用随机字符串替换每一行,即“nodoX”,其中X在max_R和min_R之间是随机的。但是,为此,我应该在先前的awk命令中包含随机X的计算。这可能吗?
由于
丹尼尔
答案 0 :(得分:1)
您可以创建用户定义的函数并根据需要传入值。像这样的东西 -
awk 'function randInt(low, hi) {
x = rand()
y = (hi - low) + 1
z = int((x * y) + low)
return z} /"trajectory"/ {x=randInt(100,1000); sub(/"nodo[0-9]"/,"\"nodo"x"\"")}1' XML_FILE
<强>执行:强>
[jaypal:~/Temp] cat XML_FILE
<attr name="trajectory" value="nodo2"/>
<attr name="trajectory" value="nodo2"/>
<attr name="trajectory" value="nodo2"/>
<attr name="trajectory" value="nodo2"/>
<attr name="trajectory" value="nodo2"/>
<attr name="trajectory" value="nodo2"/>
<attr name="trajectory" value="nodo2"/>
<attr name="trajectory" value="nodo2"/>
<attr name="trajectory" value="nodo2"/>
<attr name="trajectory" value="nodo2"/>
[jaypal:~/Temp] awk 'function randInt(low, hi) {
x = rand()
y = (hi - low) + 1
z = int((x * y) + low)
return z} /"trajectory"/ {x=randInt(100,1000); sub(/"nodo[0-9]"/,"\"nodo"x"\"")}1' XML_FILE
<attr name="trajectory" value="nodo857"/>
<attr name="trajectory" value="nodo455"/>
<attr name="trajectory" value="nodo805"/>
<attr name="trajectory" value="nodo819"/>
<attr name="trajectory" value="nodo921"/>
<attr name="trajectory" value="nodo277"/>
<attr name="trajectory" value="nodo402"/>
<attr name="trajectory" value="nodo792"/>
<attr name="trajectory" value="nodo350"/>
<attr name="trajectory" value="nodo599"/>
答案 1 :(得分:0)
在awk中,连接是你的朋友。
awk 'BEGIN{srand();};/"trajectory"/ {R=rand(); sub(/"nodo[0-9]"/,"nodo" R )}1' $XML_FILE
如果你想要一系列可重复的随机数,那么用srand()删除BEGIN块。
数学头将准确添加如何在最小和最大数字之间获得随机值。它涉及max的'%'(modulo)运算符,但我现在不记得如何强制最小值,除了像(R >= minVal)
这样的测试。这需要一个循环,所以可能有一个更简洁的方法。
我希望这会有所帮助。