用awk随机替换给定的模式

时间:2011-11-29 16:57:47

标签: awk

我有一个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的计算。这可能吗?

由于

丹尼尔

2 个答案:

答案 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)这样的测试。这需要一个循环,所以可能有一个更简洁的方法。

我希望这会有所帮助。