生成隨機(jī)號(hào)碼

公司要求每月發(fā)彩漫卫旱,發(fā)的條數(shù)還要達(dá)到一定數(shù)量。但你知道做為程序員坐昙,沒有那么多的可以發(fā)送對(duì)象,所以只能生成隨機(jī)號(hào)碼芋忿。

生成的號(hào)碼有4點(diǎn)要求:

  1. 不能發(fā)給公司人員
  2. 不能發(fā)給用戶
  3. 每個(gè)號(hào)碼只會(huì)收到一次
  4. 移動(dòng)號(hào)碼

公司人員是有通信錄的炸客,其中包含號(hào)碼信息襟士,但導(dǎo)出的是xls格式的通信錄文件。
自己不會(huì)網(wǎng)頁自動(dòng)化嚷量,導(dǎo)出xls文件只能手動(dòng)完成陋桂,而且只能一個(gè)部門一個(gè)部門的導(dǎo)出,部門又多蝶溶,真是體力活啊嗜历。
每個(gè)月都有新人入職或離職,為了保持最新抖所,每個(gè)月都重新導(dǎo)出一次梨州,真是體力活啊!

咪咕的用戶太多了,又不會(huì)向我們公開田轧,所以第2點(diǎn)是做不到的暴匠。只能努力做到第1點(diǎn)

為了不打擾陌生人,每次發(fā)過的號(hào)碼都記下來傻粘,下個(gè)月不再發(fā)送每窖,以后也不再發(fā)送,也就說只會(huì)收到一次弦悉。

移動(dòng)號(hào)碼段:1340-1348窒典,135-139,150-152稽莉,157-159瀑志,182-184,187-188

環(huán)境

  • create_no_migu_phone.sh運(yùn)行會(huì)生成no_migu_phone.txt污秆,sorted_migu.txt

  • no_migu_phone.txt我們需要的最終通信錄

  • 20170422070548.xls為部門通信錄

  • 文件夾為子公司

  • sorted_all.txt由執(zhí)行excel2json.js腳本后生成劈猪,為子公司通信錄

  • sorted_migu.txt為包含所有子公司的通信錄

  • no_migu_phone-2月.txtno_migu_phone.txt更名而來,已發(fā)送過的號(hào)碼

數(shù)據(jù)準(zhǔn)備和腳本運(yùn)行步驟:

  1. 先從公司網(wǎng)站導(dǎo)出各部門的通信錄文件良拼,比如20170422070548.xls
  2. node excel2json.js生成sorted_all.txt
  3. 重命名no_migu_phone.txtno_migu_phone-2月.txt
  4. 運(yùn)行create_no_migu_phone.sh

代碼

create_no_migu_phone.sh

#!/usr/bin/env bash
##author: zhoujie<13456774460@139.com>
##這個(gè)腳本的作用是:生成咪咕彩漫的xxxxxxxx|xxxxxxxx格式的通信錄文件战得,并排除咪咕號(hào)碼

##調(diào)試開關(guān)
#set -eux

readonly randSortedFile=sorted_rand.txt
readonly miguSortedFile=sorted_migu.txt

##生成一定范圍內(nèi)的隨機(jī)數(shù)
##$1:最小的數(shù)
##$2:最大的數(shù)
function rand() {  
    local min=$1  
    local max=$(($2-min+1))  
    local num
    num=$(head -n 11 < /dev/urandom | cksum | awk -F ' ' '{print $1}') 
    echo $((num%max+min)) 
}

##生成咪咕通信錄
function create_migu_phones () {
    echo "生成咪咕通信錄:${miguSortedFile}......."

    ##找出所有子公司目錄下的sorted_all.txt文件   
    local company
    company=$(find . -mindepth 1 -name sorted_all.txt)

    ##讀取所有sorted_all.txt文件內(nèi)容,并排序和剔除重復(fù)號(hào)碼将饺,最后寫入${miguSortedFile}文件
    cat $company | sort -u > ${miguSortedFile} 
} 

##生成隨機(jī)號(hào)碼
function create_random_phones () {
    echo "生成隨機(jī)號(hào)碼:${randSortedFile}......"

    local randFile=rand.txt

    true > ${randFile}

    ##生成randFile(rand.txt)文件
    for (( i = 0; i < 3000; i = $((i + 1)) )); do
        rnd=$(rand 13400000000 13999999999)
        printf "%d|%d\n" "$rnd" "$rnd" >>${randFile}
    done

    #排序隨機(jī)號(hào)碼
    sort -u ${randFile} > ${randSortedFile}

    #刪除隨機(jī)號(hào)碼文件
    rm ${randFile}
} 


create_migu_phones

create_random_phones

#生成最終結(jié)果
##排除已在前面月份中發(fā)過的號(hào)碼
function comm_months_and_migu_phones () {

    local noMiguFile=no_migu_phone.txt

    echo "生成排除咪咕的通信錄:${noMiguFile}......."

    local months_and_migu_phones=months_and_migu_phones.txt

    ##清空temp.txt
    true >temp.txt

    ##把前面月份中的號(hào)碼寫入temp.txt
    find . -maxdepth 1 -name "no_migu_phone-*" -exec cat {} >>temp.txt \;

    ##把咪咕中的號(hào)碼寫入temp.txt
    cat ${miguSortedFile} >>temp.txt

    ##排序并排除重復(fù)的號(hào)碼
    sort -u temp.txt >$months_and_migu_phones
    rm temp.txt

    ##生成最終結(jié)果
    comm -23 ${randSortedFile} ${months_and_migu_phones} >${noMiguFile}

    ##清除生成的中間文件
    rm $months_and_migu_phones   
}

comm_months_and_migu_phones

rm ${randSortedFile}

echo Done!!!
 

代碼

excel2json.js

#!/usr/bin/env node
//需要安裝node_xj:  npm install xls-to-json

node_xj = require("xls-to-json");

var fs = require('fs');
var path = require('path');

fs.readdir(process.cwd(), function (err, files) {
    var allPhones = [];
    files.forEach(function (file) {
        var basename = path.basename(file);
        var ext = path.extname(file);
        var jsonname = basename + '.json';
        if (ext === '.xls') {

            node_xj({
                input: basename,  // input xls 
                output: null, // output json 
                sheet: "數(shù)據(jù)"  // specific sheetname 
            }, function (err, result) {
                if (err) {
                    console.error(err);
                } else {
                    var obj = result;
                    obj.forEach(function (person) {
                        allPhones.push(person["手機(jī)"]);
                    });
                }
            });
        }
    });

    var sorted_all_file = 'sorted_all.txt'; 
    if( fs.existsSync(sorted_all_file) ) {
        fs.unlinkSync(sorted_all_file);
    }
    
    setTimeout(function () {        
        function onlyUnique(value, index, self) {
            return self.indexOf(value) === index;
        }
        var sorted = allPhones.sort();
        var unique = sorted.filter(onlyUnique);
        unique.forEach(function (item) {
            fs.appendFileSync(sorted_all_file, item + '|' + item + '\n');
        });

    }, 5 * 1000);
});

js代碼生成隨機(jī)號(hào)碼

#!/usr/bin/env node

var fs = require('fs');

const createRandomPhones = (min, max, count) => {
    let phones = [];
    const d = max - min + 1;
    while (phones.length < count) {
        const randonNum = Math.floor(Math.random() * d + min);
        if (phones.includes(randonNum) === false) {
            phones.push(randonNum);
        }
    }
    return phones;    
} 

//移動(dòng)號(hào)碼段
///////////////////////////////////////////////////
function RangePhone(min, max, ratio) {
    this.min = min;
    this.max = max;
    this.ratio = ratio;
}

const r1340_1348 = new RangePhone(13400000000, 13489999999, 1);

const r135_139 = new RangePhone(13500000000, 13999999999, 5);

const r150_152 = new RangePhone(15000000000, 15299999999, 3);

const r157_159 = new RangePhone(15700000000, 15999999999, 3);

const r182_184 = new RangePhone(18200000000, 18499999999, 3);

const r187_188 = new RangePhone(18700000000, 18899999999, 3);

///////////////////////////////////////////////////

const mobileRanges = [r1340_1348, r135_139, r150_152, r157_159, r182_184, r187_188];

const totalCount = 3000;
const totalRatio = mobileRanges.reduce( (accumulator, currentValue) => {return accumulator + currentValue.ratio },0);

//按各個(gè)手機(jī)號(hào)碼段所占比例贡避,生成總共totalCount個(gè)隨機(jī)號(hào)碼
let phones = [];

mobileRanges.forEach( (item) => {
    const {min, max} = item;//對(duì)象的解構(gòu)賦值
    let count = Math.floor(item.ratio / totalRatio * totalCount); 
    let sorted = createRandomPhones(min, max, count);
    phones = phones.concat(sorted);
});

let file = 'sorted_rand.txt';

if( fs.existsSync(file) ) {
    fs.unlinkSync(file);
} 

//把隨機(jī)號(hào)碼排序并寫入文件
let sorted = phones.sort(); 
sorted.forEach(function (item) {
    fs.appendFileSync(file, `${item}|${item}\n`);//``//模板字符串 
});

最新代碼

如有代碼有更新,請(qǐng)參考https://github.com/zhoujie903/Shell

[TOC]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末予弧,一起剝皮案震驚了整個(gè)濱河市刮吧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掖蛤,老刑警劉巖杀捻,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚓庭,居然都是意外死亡致讥,警方通過查閱死者的電腦和手機(jī)仅仆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垢袱,“玉大人墓拜,你說我怎么就攤上這事∏肫酰” “怎么了咳榜?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爽锥。 經(jīng)常有香客問我涌韩,道長,這世上最難降的妖魔是什么氯夷? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任臣樱,我火速辦了婚禮,結(jié)果婚禮上腮考,老公的妹妹穿的比我還像新娘雇毫。我一直安慰自己,他們只是感情好秸仙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布嘴拢。 她就那樣靜靜地躺著桩盲,像睡著了一般寂纪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赌结,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天捞蛋,我揣著相機(jī)與錄音,去河邊找鬼柬姚。 笑死拟杉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的量承。 我是一名探鬼主播搬设,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼撕捍!你這毒婦竟也來了拿穴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤忧风,失蹤者是張志新(化名)和其女友劉穎默色,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狮腿,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腿宰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年呕诉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吃度。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甩挫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椿每,到底是詐尸還是另有隱情捶闸,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布拖刃,位于F島的核電站删壮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兑牡。R本人自食惡果不足惜央碟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望均函。 院中可真熱鬧亿虽,春花似錦、人聲如沸苞也。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽如迟。三九已至收毫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間殷勘,已是汗流浹背此再。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玲销,地道東北人输拇。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像贤斜,于是被迫代替她去往敵國和親策吠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評(píng)論 25 707
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,575評(píng)論 1 118
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理瘩绒,服務(wù)發(fā)現(xiàn)猴抹,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 今天姨媽來了草讶,在家趴著洽糟,看完了胡歌的書《幸福的拾荒者》,突然開始喜歡上了這個(gè)演員,欣賞他的生活態(tài)度坤溃,待人的大方溫和...
    舒馨頎閱讀 276評(píng)論 0 0
  • 讀完整本《嫌疑人X的獻(xiàn)身》拍霜,整個(gè)人都沉在一股悲傷的氛圍中。原諒我的見 識(shí)短淺薪介,只在這本書中讀到了愛情祠饺。你本是...
    心向天涯閱讀 198評(píng)論 1 1