Awk

輸入的隨機輸出

  • May 7, 2021

相關問題:如何根據使用者輸入創建隨機輸出

我想從使用者那裡獲取一個輸入(只有一個參數),就像Hello. 而且,我想給出類似的輸出

olleho
llohe
he
llo
lo

就像上面一樣。而且,我想從那個單一的輸入中製作數百萬個樣本。我想將這些文本保存在 txt 格式的文件中。怎麼做?


假設,我將我的電子郵件地址作為參數 Istiakshovon0@gmail.com。所以,現在我想用這個帳戶設置相關密碼。下面給出了一些範例輸出:

Istiakshovon0@gmail.com
Istiakshovon
Istiak
Ishovon
Ishovon0
Iksgc
gmail
moc

我想盡可能地創建範例密碼。


我添加了awk標籤,因為我注意到很多人都在使用 awk 來格式化文本。我不熟悉它(我只是一個初學者 Linux 使用者)。這就是我添加它的原因。

使用 perl 和Algorithm::Permute庫模組:

#!/usr/bin/perl

use strict;
use Algorithm::Permute qw(permute);

my $string = 'hello';
my @array = split //, $string;
permute { print join("",@array), "\n" } @array;
$ ./permute.pl | head
hello
helol
heoll
hoell
ohell
hello
helol
heoll
hoell
ohell

上面的版本只列印與原始版本相同長度的排列。

下面的版本執行從長度 1 到相同長度的所有排列:

#!/usr/bin/perl

use strict;
use Algorithm::Permute;

my $string = shift; # New & Improved! Now takes an argument!

# un-comment only ONE of the following two lines:
#for my $i (reverse 1 .. length($string)) {
for my $i (1 .. length($string)) {

 my $p = Algorithm::Permute->new([split //, $string], $i);
 while (my @res = $p->next) {
   print join('',@res), "\n";
 };
};

另存為,例如permute.pl. 使其可執行chmod +x permute.pl並執行如下:

$ ./permute.pl hello

注意 1:事實證明,在 Algorithm::Permute 模組中執行完整排列時,原始數組被清空,這會擦除呼叫它的數組。

這絕對是非 perlish 行為,可能是因為該模組不是本機 perl,它是一個圍繞已編譯 C 函式的薄 perl 包裝器……並且 C 函式是以破壞數組的方式編寫的。

無論如何,這就是為什麼我擺脫了這my @array = split //, $string條線,並用於[split //, $string]為該Algorithm::Permute->new()方法生成一個匿名數組。這可確保在每次循環時重新創建數組。

通常,如果一個數組沒有(或不應該)在循環內被修改,它應該只在循環外創建一次。

注意 2:如果要反轉輸出順序,請將腳本的輸出通過管道傳輸到tac,或將腳本中的 for 循環更改為:

for my $i (reverse 1 .. length($string)) {

這樣做是提醒我注意這個錯誤的原因。上面的更新版本現在可以使用或不使用reverse.

假設使用者的輸入在變數userinput中,那麼下面的awk程式碼將對該輸入生成一個永無止境的隨機採樣。

userinput=$userinput awk '
   BEGIN {
       s = ENVIRON["userinput"] "\n"
       n = length(s)
       while (1)
           printf "%s", substr(s,int(1+rand()*n),1)
   }'

這需要 的值$userinput,在字元串的末尾添加一個換行符,然後開始從該字元串中寫入隨機字元,直到您中斷程式碼。添加的換行符確保我們每隔一段時間在輸出中獲得換行符。

使用head命令可以限制輸出的行數。如果您想要 1000 行,請通過管道輸出head -n 1000. 使用以下命令測試前 10 行輸出userinput='Hello World!'

$ userinput='Hello World!'
$ userinput=$userinput awk '
   BEGIN {
       s = ENVIRON["userinput"] "\n"
       n = length(s)
       while (1)
           printf "%s", substr(s,int(1+rand()*n),1)
   }' | head
ld l!lodd loWHe! o
H lolooel
o
eo !lll
WrlHellHod
rlll
o!Hddrd

l!lHelWloodWddeodldHHlo!d l ll oorordeoellrWHledW!!WrW W!l
l!od

如果要刪除空行,則將輸出通過sed '/./!d'.

從輸入的第一行獲取輸入字元串的命令變體:

awk '{
       s = $0 "\n"
       n = length(s)
       while (1)
           printf "%s", substr(s,int(1+rand()*n),1)
   }'

引用自:https://unix.stackexchange.com/questions/648230