为表中的特定列生成随机数

时间:2015-04-23 10:31:59

标签: linux awk sed

如何为所需列中的值生成随机数?

例如: 我有以下数据,我想为第3列生成随机数。

Col1                  Col2,  Col3,     Col4, col5, col 6
2015-04-05 12:00:00Z, Rob-1, 47176121, 6,    3,    0.0
2015-04-05 12:00:00Z, Rob-2, 47176121, 6,    4,    0.0
2015-04-05 12:00:00Z, Rob-3, 37856233, 4,     ,    0.0
2015-04-05 12:00:00Z, Rob-4, 37856233, 5,     ,    0.0
2015-04-05 12:00:00Z, Rob-4, 4152121,  6,    0,    0.0
2015-04-05 12:00:00Z, Rob-5, 41452121, 16,    ,    0.0
2015-04-05 12:00:00Z, Rob-6, 41452121, 6,    0,    0.0

我使用了awk '!a[$0]{do{x=int(rand()*100000000);a[$0]=x}while(b[x])}{print $0,a[$0]}' file

但这似乎不起作用。

编辑 预期的输出应该是: -

Col1                  Col2,  Col3,     Col4, col5, col 6
2015-04-05 12:00:00Z, Rob-1, 111, 6,    3,    0.0
2015-04-05 12:00:00Z, Rob-2, 111, 6,    4,    0.0
2015-04-05 12:00:00Z, Rob-3, 567, 4,     ,    0.0
2015-04-05 12:00:00Z, Rob-4, 567, 5,     ,    0.0
2015-04-05 12:00:00Z, Rob-4, 90009,  6,    0,    0.0
2015-04-05 12:00:00Z, Rob-5, 90009, 16,    ,    0.0
2015-04-05 12:00:00Z, Rob-6, 90009, 6,    0,    0.0

当第3列中的新值是随机生成的数字时,它与之前的值一致,因此如果该值出现多次,则它将具有相同的随机数一致

1 个答案:

答案 0 :(得分:3)

问题在于你只是没有替换第3个字段

BEGIN {srand()}

请注意,awk(无论如何都是gawk)每次都会生成相同的伪随机数序列。如果您不想这样做,请添加awk -F", " -v OFS=", " ' NR > 1 {$3 = ($3 in r ? r[$3] : r[$3]=int(rand()*100000000))} {print} ' file ref

哦,所以你要替换键入该值的$ 3中的每个值。 OK:

Col1                  Col2,  Col3,     Col4, col5, col 6
2015-04-05 12:00:00Z, Rob-1, 23778751, 6,    3,    0.0
2015-04-05 12:00:00Z, Rob-2, 23778751, 6,    4,    0.0
2015-04-05 12:00:00Z, Rob-3, 29106573, 4,     ,    0.0
2015-04-05 12:00:00Z, Rob-4, 29106573, 5,     ,    0.0
2015-04-05 12:00:00Z, Rob-4, 84581385,  6,    0,    0.0
2015-04-05 12:00:00Z, Rob-5, 15220829, 16,    ,    0.0
2015-04-05 12:00:00Z, Rob-6, 15220829, 6,    0,    0.0
gsutil -m cp -r gs://my-dra-bucket/* gs://my-nearline-bucket/