!/bin/bash
for file in ~/tdg/*.TXT
do
while read p; do
randvalue=`shuf -i 1-99999 -n 1`
sed -i -e "s/55555/${randvalue}/" $file
done < $file
done
这是我的剧本。我每次找到它时都试图用不同的随机数替换55555。这当前有效,但它用相同的随机数替换55555的每个实例。我试图用$ p替换sed命令末尾的$ file,但这只会爆炸。
实际上,即使我达到了要点,同一行上的每个实例都是相同的随机数,但每行使用一个新的随机数,那么我会很高兴。
修改
我应该指定这个。我想在文件中保存替换结果,而不是仅将结果打印到控制台。
修改
在JNevill的精彩帮助下,我的剧本的最终工作版本:
!/bin/bash
for file in ~/tdg/*.TXT
do
while read p;
do
gawk '{$0=gensub(/55555/, int(rand()*99999), "g", $0)}1' $file > ${file}.new
done < $file
mv -f ${file}.new $file
done
答案 0 :(得分:2)
由于这样做是在sed获取pretty awful and quickly,您可能需要切换到awk来执行此操作:
awk '{$0=gensub(/55555/, int(rand()*99999), "g", $0)}1' $file
使用此方法,您可以删除内部循环,因为它会像awk一样逐行遍历整个文件。
你可以换掉整个脚本并直接将通配符文件名提供给awk:
awk '{$0=gensub(/55555/, int(rand()*99999), "g", $0)}1' ~/tdg/*.TXT
答案 1 :(得分:1)
JNevill解决方案的变体,每次运行脚本时都会生成一组不同的随机数...
示例数据文件:
$ cat grand.dat
abc def 55555
xyz-55555-55555-__+
123-55555-55555-456
987-55555-55555-.2.
.+.-55555-55555-==*
脚本:
$ cat grand.awk
{ $0=gensub(/55555/,int(rand()*seed),"g",$0); print }
gensub(...)
:与Nevill的回答相同,而我们会使用我们的种子价值混合rand()
乘数[你可以在这里抛出任何数字你希望帮助确定结果值的大小] 55555
的所有出现次数脚本在行动:
$ awk -f grand.awk seed=${RANDOM} grand.dat
abc def 6939
xyz-8494-8494-__+
123-24685-24685-456
987-4442-4442-.2.
.+.-17088-17088-==*
$ awk -f grand.awk seed=${RANDOM} grand.dat
abc def 4134
xyz-5060-5060-__+
123-14706-14706-456
987-2646-2646-.2.
.+.-10180-10180-==*
$ awk -f grand.awk seed=${RANDOM} grand.dat
abc def 4287
xyz-5248-5248-__+
123-15251-15251-456
987-2744-2744-.2.
.+.-10558-10558-==*
seed=$RANDOM
:让操作系统为我们生成一个随机int并作为awk
变量seed
脚本
答案 2 :(得分:0)
这是如何真正做你想用GNU awk做的事情:
awk -i inplace '{ while(sub(/55555/,int(rand()*99999)+1)); print }' ~/tdg/*.TXT
不需要shell循环或临时文件,它将在所有文件中和所有文件中使用不同的随机数替换每个55555。
其他问题就是:
seed="$RANDOM"
for file in ~/tdg/*.TXT; do
seed=$(awk -v seed="$seed" '
BEGIN { srand(seed) }
{ while(sub(/55555/,int(rand()*99999)+1)); print > "tmp" }
END { print int(rand()*99999)+1 }
' "$file") &&
mv tmp "$file"
done