亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Linux Shell > 正文

Shell腳本實現亂序排列文件內容的多種方法(洗牌問題)

2020-07-27 19:08:52
字體:
來源:轉載
供稿:網友

洗牌問題:洗一副撲克,有什么好辦法?既能洗得均勻,又能洗得快?即相對于一個文件來說怎樣高效率的實現亂序排列?

ChinaUnix 確實是 Shell 高手云集的地方,只要你想得到的問題,到那里基本上都能找到答案。r2007 給出了一個取巧的方法,利用 Shell 的 $RANDOM 變量給原文件的每一行加上隨機的行號然后根據這個隨機行號進行排序,再把臨時加上去的行號給過濾掉,這樣操作之后得到的新文件就相當于被隨機“洗”了一次:

復制代碼 代碼如下:

while read i;do echo "$i $RANDOM";done<file|sort -k2n|cut -d" " -f1

當然如果你的源文件每行的內容比較復雜的話就必須對這段代碼進行改寫,但只要知道了處理的關鍵技巧,剩下的問題都不難解決。

另外一篇來自蘇蓉蓉的用 awk 來實現洗牌效果的隨機文件排序代碼分析(原貼在這里,以及對此帖的一個后續討論,如果你沒有登錄帳號的話可以到這里查看精華區文章)則寫的更為詳細:
--------------------------------------------------------------------
關于洗牌問題,其實已經有了一個很好的shell解法,這里另外給三個基于AWK的方法,有錯誤之處還請不吝指出。

方法一:窮舉

類似于窮舉法,構造一個散列來記錄已經打印行出現行的次數,如果出現次數多于一次則不進行處理,這樣可以防止重復,但缺點是加大了系統的開銷。

復制代碼 代碼如下:

awk -v N=`sed -n '$=' data` '
BEGIN{
FS="/n";
RS=""
}
{
srand();
while(t!=N){
  x=int(N*rand()+1);
  a[x]++;
  if(a[x]==1)
    {
        print $x;t++
    }
  }
}
' data

方法二:變換

基于數組下標變換的辦法,即用數組儲存每行的內容,通過數組下標的變換交換數組的內容,效率好于方法一。

復制代碼 代碼如下:

#! /usr/awk

BEGIN{
srand();
}

{
b[NR]=$0;
}

END{

C(b,NR);
for(x in b)
  {
    print b[x];
  }}

function C(arr,len,i,j,t,x){

for(x in arr)
  {
      i=int(len*rand())+1;
      j=int(len*rand())+1;
      t=arr[i];
      arr[i]=arr[j];
      arr[j]=t;
  }

}


方法三:散列

    三個方法中最好的。
    利用AWK中散列的特性(詳細請看:info gawk 中的7.x ),只要構造一個隨機不重復的散列函數即可,因為一個文件每行的linenumber是獨一無二的,所以用:

    隨機數+每行linenumber    ------對應------>    那一行的內容

    即為所構造的隨機函數。
    從而有:

復制代碼 代碼如下:

awk 'BEGIN{srand()}{b[rand()NR]=$0}END{for(x in b)print b[x]}' data

    其實大家擔心的使用內存過大的問題不必太在意,可以做一個測試:

測試環境:

PM 1.4GHz CPU,40G硬盤,內存256M的LAPTOP
SUSE 9.3  GNU bash version 3.00.16 GNU Awk 3.1.4

產生一個五十幾萬行的隨機文件,大約有38M:

復制代碼 代碼如下:

od /dev/urandom |dd  count=75000 >data

拿效率較低的方法一來說:

洗牌一次所用時間:

復制代碼 代碼如下:

time awk -v N=`sed -n '$=' data` '
BEGIN{
FS="/n";
RS=""
}
{
srand();
while(t!=N){
  x=int(N*rand()+1);
  a[x]++;
  if(a[x]==1)
    {
        print $x;t++
    }
  }
}
' data

結果(文件內容省略):
復制代碼 代碼如下:

real    3m41.864s
user    0m34.224s
sys     0m2.102s

所以效率還是勉強可以接受的。

方法二的測試:

復制代碼 代碼如下:

time awk -f awkfile datafile

結果(文件內容省略):
復制代碼 代碼如下:

real    2m26.487s
user    0m7.044s
sys     0m1.371s

效率明顯好于第一個。

接著考察一下方法三的效率:

復制代碼 代碼如下:

time awk 'BEGIN{srand()}{b[rand()NR]=$0}END{for(x in b)print b[x]}' data

結果(文件內容省略):
復制代碼 代碼如下:

real    0m49.195s
user    0m5.318s
sys     0m1.301s

對于一個38M的文件來說已經相當不錯了。
--------------------------------------------------------------------

附帶存一個來自 flyfly 寫的 python 版本亂序代碼:

復制代碼 代碼如下:

#coding:gb2312
import sys
import random

def usage():
print "usage:program srcfilename dstfilename"
global filename
filename = ""
try:
filename = sys.argv[1]
except:
usage()
raise()
#open the phonebook file

f = open(filename, 'r')
phonebook = f.readlines()
print phonebook
f.close()

#write to file randomly
try:
filename = sys.argv[2]
except:
usage()
raise()

f = open(filename, 'w')
random.shuffle(phonebook)
f.writelines(phonebook)
f.close()

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线日韩欧美视频| 亚洲三级av在线| 91视频8mav| 中文字幕欧美精品日韩中文字幕| 精品国产福利在线| 久久久久免费视频| 黑人精品xxx一区一二区| 日韩视频一区在线| 久久久久久12| 91精品视频免费观看| 国产精品天天狠天天看| 国产欧美日韩精品专区| 亚洲成人网av| 亚洲一区中文字幕在线观看| 91天堂在线视频| 亚洲精品久久在线| 久久99精品久久久久久青青91| 欧美日韩亚洲系列| 国产精品视频久久久| 日韩中文字幕视频在线观看| 国产91免费看片| 精品少妇v888av| 中文国产成人精品| 成人日韩在线电影| 91在线观看免费高清完整版在线观看| 亚洲自拍在线观看| 久久亚洲精品小早川怜子66| 992tv成人免费影院| 日韩欧美一区二区三区久久| 久久五月情影视| 欧美一级电影久久| 国产精品偷伦视频免费观看国产| 亚洲图片在线综合| 亚洲欧美日韩国产中文专区| 大胆人体色综合| 亚洲国产精品小视频| 中文字幕日韩欧美精品在线观看| 一区二区三区亚洲| 久久精品这里热有精品| 亚洲国产成人精品电影| 日韩毛片在线观看| 精品久久久久久久久久久久久久| 伦伦影院午夜日韩欧美限制| 久久久久久久亚洲精品| 正在播放欧美一区| 97精品国产97久久久久久春色| 自拍视频国产精品| 欧美老女人在线视频| 日韩精品中文字幕在线播放| 欧美色道久久88综合亚洲精品| 欧美日本啪啪无遮挡网站| 91久久精品久久国产性色也91| 欧美亚洲另类制服自拍| 亚洲人成电影在线| 亚洲 日韩 国产第一| 欧美成人精品激情在线观看| 2019中文字幕在线免费观看| 疯狂蹂躏欧美一区二区精品| 亚洲成人久久久| 91成人国产在线观看| 久久久久久久爱| 国产午夜精品免费一区二区三区| 国产精品中文字幕在线观看| 欧美激情视频在线| 热99在线视频| 亚洲一区二区自拍| 国产精品免费一区豆花| 91精品久久久久久久久中文字幕| 日韩欧美精品网站| 国产一区二区视频在线观看| 亚洲性无码av在线| 色综合老司机第九色激情| 精品国产乱码久久久久酒店| 国产午夜精品视频免费不卡69堂| 国产精品69久久久久| 日韩经典一区二区三区| 亚洲无av在线中文字幕| 精品久久久久久久久久久久久| 日韩精品免费在线观看| 国产视频在线观看一区二区| 欧美一级视频在线观看| 日韩av免费在线| 久久成人这里只有精品| 91香蕉嫩草影院入口| 91精品视频在线播放| 色多多国产成人永久免费网站| 亚洲欧美一区二区激情| 91大神在线播放精品| 欧美日本高清视频| 97视频在线观看视频免费视频| 亚洲欧美日韩区| 大胆人体色综合| 亚洲美腿欧美激情另类| 操91在线视频| 中文字幕久久精品| 久久成人av网站| 97精品免费视频| 福利视频第一区| 国产亚洲xxx| 亚洲色图13p| 日本免费一区二区三区视频观看| 国产一区二区三区在线观看网站| 一本大道亚洲视频| 国产视频综合在线| 日本电影亚洲天堂| 亚洲成人久久久久| 欧美激情久久久久| 日韩电影免费在线观看中文字幕| 91视频免费网站| 亚洲人成在线观看网站高清| 91色精品视频在线| 国产成人综合精品在线| 国产香蕉一区二区三区在线视频| 亚洲一级一级97网| 久久九九精品99国产精品| 欧美成人三级视频网站| 亚洲最新av在线网站| 国产精品揄拍500视频| 欧美国产亚洲精品久久久8v| 日韩精品视频在线播放| 国产精品电影久久久久电影网| 欧美电影在线观看| 久久精品视频在线播放| 亚洲成**性毛茸茸| 欧美高清视频免费观看| 91久久精品国产| 国产精品视频99| 富二代精品短视频| 亚洲人成网7777777国产| 国产精品亚洲一区二区三区| 亚洲成年人在线播放| 日韩欧美大尺度| 国产精品三级久久久久久电影| 在线性视频日韩欧美| 亚洲国产精品福利| 日韩欧美在线观看| 亚洲国模精品私拍| 亚洲人成啪啪网站| 最近2019中文字幕mv免费看| 另类天堂视频在线观看| 草民午夜欧美限制a级福利片| 国产精品久久久久久久久久久不卡| 国产亚洲视频在线观看| www.国产精品一二区| 久久免费精品日本久久中文字幕| 九九九久久久久久| 久久中文久久字幕| 在线观看国产精品日韩av| 欧美风情在线观看| 亚洲福利精品在线| 国产精品扒开腿做爽爽爽男男| 国产精品视频自拍| 91地址最新发布| 亚洲成av人片在线观看香蕉| 国产成人久久精品| 亚洲一区二区在线| 久久91超碰青草是什么| 国产日韩欧美影视| 欧美日韩国产二区| 亚洲国产欧美一区二区三区久久| 91中文精品字幕在线视频| 久久免费视频这里只有精品| 中文字幕v亚洲ⅴv天堂| 久久久久久这里只有精品|