用带有awk的随机模式替换给定模式
我有一个XML文件,其中有一组条目,如下所示:用带有awk的随机模式替换给定模式,awk,Awk,我有一个XML文件,其中有一组条目,如下所示: <attr name="trajectory" value="nodo2"/> 在前一行中,我将用相同的值“nodoR”替换所有“node[0-9]”值。这不是我想要的,我想要用一个随机字符串替换每一行,即“nodoX”,其中X在max_R和min_R之间是随机的。但是,为此,我应该在之前的awk命令中包含随机X的计算。这可能吗 谢谢 Daniel在awk中,连接是你的朋友 awk 'BEGIN{srand();};/"traject
<attr name="trajectory" value="nodo2"/>
在前一行中,我将用相同的值“nodoR”替换所有“node[0-9]”值。这不是我想要的,我想要用一个随机字符串替换每一行,即“nodoX”,其中X在max_R和min_R之间是随机的。但是,为此,我应该在之前的awk命令中包含随机X的计算。这可能吗
谢谢
Daniel在awk中,连接是你的朋友
awk 'BEGIN{srand();};/"trajectory"/ {R=rand(); sub(/"nodo[0-9]"/,"nodo" R )}1' $XML_FILE
如果需要一系列可重复的随机数,请使用srand()删除BEGIN块
数学头将精确地添加如何获得最小值和最大值之间的随机值。它涉及max的“%”(模)运算符,但我现在不记得如何强制最小值,除非使用类似(R>=minVal)
的测试。这需要一个循环,所以可能有一个更简洁的方法
我希望这会有所帮助。您可以创建一个用户定义的函数,并根据需要传入值。像这样的-
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"/>
[jaypal:~/Temp]cat XML\u文件
[jaypal:~/Temp]awk'功能随机数(低、高){
x=rand()
y=(高-低)+1
z=int((x*y)+低)
返回z}/“轨迹”/{x=randInt(1001000);sub(/“nodo[0-9]”,“\“nodo”x“\”)}1'XML\u文件
:)谢谢你@Sheller。所有这些学习都是从遵循你的答案开始的。你的,还有迈克尔·J·巴伯、格伦·杰克曼、肯特和其他几个人。谢谢!这个解决方案是完美的。
[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"/>