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

我是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

我的问题是从哪里开始?首选的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%