Perl 如何制作脚本以生成文件并插入百分比分布中的文本?
我是bash/perl脚本编写的真正新手,但我必须想出解决这个问题的方法 我需要生成以英文字母命名的文件,从Perl 如何制作脚本以生成文件并插入百分比分布中的文本?,perl,bash,Perl,Bash,我是bash/perl脚本编写的真正新手,但我必须想出解决这个问题的方法 我需要生成以英文字母命名的文件,从1到9,a到z和a到z。 因此,总共将有61个文件 之后,我需要根据预定义的分发向每个文件插入文本,例如: text1 80% text2 10% text3 5% text4 2% text5 2% text6 1% 当每个文件仅包含一个文本时,从示例中可以看出,例如名为C的文件将包含文本text1。类似地,名为7的文件有5%的几率包含文本text3 我的问题是从哪里开始?首选的bas
1到9
,a到z
和a到z
。
因此,总共将有61个文件
之后,我需要根据预定义的分发向每个文件插入文本,例如:
text1 80%
text2 10%
text3 5%
text4 2%
text5 2%
text6 1%
当每个文件仅包含一个文本时,从示例中可以看出,例如名为C
的文件将包含文本text1
。类似地,名为7
的文件有5%的几率包含文本text3
我的问题是从哪里开始?首选的bash或perl是什么?我认为生成文件会有点容易,但是根据发行版将文本回显到文件会很棘手
这就是我使用bash的地方:
创建文件并输入相同的文本:
for f in {a..z} {A..Z} {1..9}
do
echo text > "$f"
done
编辑:它在ubuntu 10.4下我不确定你的问题是否正确。但我想你要找的是一个基本的随机数发生器。也许这可以帮助你:
祝你好运,我不确定你的问题是否正确。但我想你要找的是一个基本的随机数发生器。也许这可以帮助你:
祝你好运在bash中创建文件是件小事,填充文件不是很干净,但也不是那么糟糕:
for file in {1..9} {a..z} {A..Z}; do
(
line=$((RANDOM % 100))
if (( line < 80 )); then
echo text1
elif (( line < 90 )); then
echo text2
elif (( line < 95 )); then
echo text3
[...]
fi
) >$file
done
用于{1..9}{a..z}{a..z}中的文件;做
(
行=$((随机%100))
如果((行<80));则
回声文本1
elif((行<90));然后
回声文本2
elif((行<95));然后
回声文本3
[...]
fi
)>$file
完成
$RANDOM
不是一个很好的随机性来源,但它可能适合这种情况。在bash中创建文件很简单,填充文件不是很干净,但也不是很糟糕:
for file in {1..9} {a..z} {A..Z}; do
(
line=$((RANDOM % 100))
if (( line < 80 )); then
echo text1
elif (( line < 90 )); then
echo text2
elif (( line < 95 )); then
echo text3
[...]
fi
) >$file
done
用于{1..9}{a..z}{a..z}中的文件;做
(
行=$((随机%100))
如果((行<80));则
回声文本1
elif((行<90));然后
回声文本2
elif((行<95));然后
回声文本3
[...]
fi
)>$file
完成
$RANDOM
不是一个很好的随机性来源,但它可能适合这种情况。这个Perl程序会按照您的要求执行
它首先获取问题中显示的文本,并将其配对为数组中的文本/百分比对。子例程gentext
使用此数据以给定的速率生成随机字符串
然后,所要做的就是运行创建文件的循环,并在每个文件中输入一个随机字符串
use strict;
use warnings;
my @rates = map [ /(\S+(?:\s+\S+)*)\s+(\d+)%?\s*$/ ], split /\n/, <<END;
text1 80%
text2 10%
text3 5%
text4 2%
text5 2%
text6 1%
END
for my $file ('a' .. 'z', 'A' .. 'Z', '0' .. '9') {
open my $fh, '>', $file or die $!;
print $fh gentext(), "\n";
}
sub gentext {
my $rn = rand() * 100;
for (@rates) {
$rn -= $_->[1];
return $_->[0] if $rn < 0;
}
}
使用严格;
使用警告;
我的@rates=map[/(\S+(?:\S+\S+)\S+(\d+)%?\S*$/],拆分/\n/,[1];
如果$rn<0,则返回$rn->[0];
}
}
此Perl程序按您的要求执行
它首先获取问题中显示的文本,并将其配对为数组中的文本/百分比对。子例程gentext
使用此数据以给定的速率生成随机字符串
然后,所要做的就是运行创建文件的循环,并在每个文件中输入一个随机字符串
use strict;
use warnings;
my @rates = map [ /(\S+(?:\s+\S+)*)\s+(\d+)%?\s*$/ ], split /\n/, <<END;
text1 80%
text2 10%
text3 5%
text4 2%
text5 2%
text6 1%
END
for my $file ('a' .. 'z', 'A' .. 'Z', '0' .. '9') {
open my $fh, '>', $file or die $!;
print $fh gentext(), "\n";
}
sub gentext {
my $rn = rand() * 100;
for (@rates) {
$rn -= $_->[1];
return $_->[0] if $rn < 0;
}
}
使用严格;
使用警告;
我的@rates=map[/(\S+(?:\S+\S+)\S+(\d+)%?\S*$/],拆分/\n/,[1];
如果$rn<0,则返回$rn->[0];
}
}
我正试图在Ubuntu下生成文件并向其插入文本。我正试图在Ubuntu下生成文件并向其插入文本。@Tom你的意思是你只想要其中一行,而不是独立的概率?只是为了确定,text2
将占用18%的时间?text2将占用10%的时间,正如你在问题中所说的那样。如果你想要其他数字,很容易将它们交换进来,这只是一个标准的随机选择算法。概率是不获取text1
=0.2倍获取text2
=0.9等于18%@Tom你的意思是你只想要其中一行,而不是独立的概率?只是为了确定,text2
将占用18%的时间?如您在问题中所述,text2将占用10%的时间。如果你想要其他数字,很容易将它们交换,这只是一个标准的随机选择算法。概率是不获取text1
=0.2倍获取text2
=0.9等于18%