awk之隨機函式rand()和srand()
轉載地址:http://blog.chinaunix.net/uid-10540984-id-2942041.html
檔案:
1234567
abcdefg
......
現在想要隨機抽取5列組成下面的內容,允許重複:
36612
cffab
......
- awk -F '' 'BEGIN{srand();for(i=1;i<=5;i++)a[i]=int(rand()*100%7+1)}{for(i=1;i<=5;i++)printf $a[i];printf RS}' file
[解析]
思路是首先把FS設定為空,隨機抽取5列,那麼在BEGIN模組定義陣列a中1~5的下標對應隨機的1~7的值,在讀行時把陣列a的值(這是個1~7的隨機值)作為欄位列印出來,這樣就實現了隨機抽取7個欄位中的5個欄位重新組成新的行。
rand()函式是隨機產生一個0到1之間的保留小數點後6位的小數值,例如0.217788,所以需要乘以100得到21.7788,然後再對7取餘,結果是0.7788,int()取整是0了,我們要獲得1~7的隨機數,所以加1,整個表示式才是 int(rand()*100%7+1) ,其實 int(length*rand()+1) 也是可以得到1~7的隨機數的,只是在BEGIN中,length函式還是為0,這樣就得到了肯定產生於1~7之間的隨機數,問題在於rand()只產生一次,怎麼讓它滾動起來呢?這裡我們還需要srand()函式,括號內沒有表示式的話,它會採用當前時間作為隨機計數器的種子,這樣以秒為間隔,隨機數就能滾動隨機生成了。最後再對應陣列a的隨機值作為欄位列印出來。
-
#!/bin/bash
-
len="5"
-
while read line; do
-
str=""
-
while [ "${#str}" -lt "$len" ]; do
-
letter="${line:$(($RANDOM%${#line})):1}"
-
str="$str$letter"
-
done
-
echo $str
- done < file
[解析]
同樣,這個shell指令碼也能實現該功能,首先定義變數 len=5 ,因為只需要5列嘛。然後從file檔案中讀入一行內容給變數 line ,定義一個長度為0的變數 str ,當 str 變數長度大於等於5了,就不再會繼續whlie迴圈,然後列印該變數,在bash中 ${#var} 就是獲取變數的長度,我們再看看怎麼實現的隨機,該shell的原理是讀取 line 變數的隨機0~6位置長度為1的字元,環境變數RANDOM,範圍是0~32767,RANDOM對7取餘的結果是0~6,就能隨機抽取長度為7的字串中的任意一個字元,然後把該字元累計給變數 str ,滿足長度5後就列印出該行。
總結使用方法:
如果得到隨機的字串,長度和字串中出現的字元表可定義,並將字串倒序顯示,如把0123456789 作為基準的字串字元表,產生一個6 位的字串642031,列印出的字串為
130246,可使用bash/perl/php/c 任意一種.
[root@520 test]# awk -v count=6 'BEGIN {srand();str="0123456789";len=length(str);for(i=count;i>0;i--) marry[i]=substr(str,int(rand()*len),1);for(i=count;i>0;i--) printf("%c",marry[i]);printf("\n");for (i=0;i<=count;i++) printf("%c",marry[i]);printf("\n")}'
743013
310347
總結使用方法:
如果得到隨機的字串,長度和字串中出現的字元表可定義,並將字串倒序顯示,如把0123456789 作為基準的字串字元表,產生一個6 位的字串642031,列印出的字串為
130246,可使用bash/perl/php/c 任意一種.
[root@520 test]# awk -v count=6 'BEGIN {srand();str="0123456789";len=length(str);for(i=count;i>0;i--) marry[i]=substr(str,int(rand()*len),1);for(i=count;i>0;i--) printf("%c",marry[i]);printf("\n");for (i=0;i<=count;i++) printf("%c",marry[i]);printf("\n")}'
743013
310347
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28371090/viewspace-1405803/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++ 中隨機函式 rand() 和 srand() 的用法C++隨機函式
- 關於rand和srand函式使用的一點心得函式
- 用C語言的rand()和srand()產生偽隨機數的方法總結C語言隨機
- matlab中的產生隨機數的rand函式Matlab隨機函式
- array_rand()函式函式
- awk學習筆記(15)-數學函式及隨機數筆記函式隨機
- MATLAB獲取隨機數——randMatlab隨機
- [CareerCup] 17.11 Rand7 and Rand5 隨機生成數字隨機
- Oracle 隨機函式Oracle隨機函式
- AWK高階之內部函式使用函式
- (轉)Oracle隨機函式Oracle隨機函式
- 由等概率生成的0和1構建rand()函式函式
- awk內建函式函式
- Oracle取隨機數函式Oracle隨機函式
- Oracle隨機函式的取法Oracle隨機函式
- 資料結構和演算法-隨機數範圍擴大 使用rand7()構造rand10()資料結構演算法隨機
- JS函式之不要隨便bindJS函式
- openresty及lua的隨機函式REST隨機函式
- AS使用Random函式建立隨機數random函式隨機
- 隨機向量特徵函式的求法隨機特徵函式
- 預設的 rand.Intn () 生成的是偽隨機數隨機
- 隨機變數函式的分佈隨機變數函式
- javascript隨機數函式Math.random()JavaScript隨機函式random
- 隨機函式DBMS_RANDOM.STRING隨機函式random
- awk基礎05-自定義函式和指令碼函式指令碼
- awk之二次分隔函式函式
- Python隨機函式random使用詳解Python隨機函式random
- 概率論08 隨機變數的函式隨機變數函式
- Kotlin之“with”函式和“apply”函式Kotlin函式APP
- 隨機之美,隨機森林隨機森林
- Matlab產生隨機數函式小結Matlab隨機函式
- java Math數學工具及Random隨機函式Javarandom隨機函式
- C語言生成隨機數函式的用法C語言隨機函式
- Oracle中生成隨機數的函式(轉載)Oracle隨機函式
- awk基礎04-內建函式函式
- 【Spark篇】---SparkSql之UDF函式和UDAF函式SparkSQL函式
- php 隨機顯示圖片的函式程式碼PHP隨機函式
- 【matlab程式設計】matlab隨機數函式Matlab程式設計隨機函式