[20231201]乱序输出.txt

–//测试需要生成seq -f “%06g” 300000的乱序输出,当时不知道bash shell如何实现,先通过oracle的sql语句建立乱序数字输出。

set pagesize 0
spool aa.txt
select lpad(level,6,’0′) from dual connect by level <=3e5 order by dbms_random.value;
spool off
–//注意设置set pagesize 0,不然中间出现多次页头。注意保持aa.txt的备份,测试要重复多次。

–//有时间看了一些bash shell文档.

$ seq -f “%06g” 5 | xargs -IQ echo Q $RANDOM
000001 395
000002 395
000003 395
000004 395
000005 395

–//这样不行.找到一个链接https://www.cnblogs.com/cnhack/articles/17164650.html
–//使用awk,测试看看.

$ seq -f “%06g” 5 | awk ‘{print $1,rand()*1000000}’ | sort -k2
000003 306394
000004 578941
000002 593909
000005 740133
000001 924046

$ seq -f “%06g” 5 | awk ‘{print $1,rand()*1000000}’ | sort -k2
000003 306394
000004 578941
000002 593909
000005 740133
000001 924046

–//视乎awk的rand()伪随机,2次执行的结果一样的.加入srand()看看.

$ seq -f “%06g” 5 | awk ‘BEGIN{srand()} {print $1,rand()*1000000}’ | sort -k2
000002 614333
000003 75798.2
000001 763180
000005 791454
000004 826102
–//重复两次结果不一样.

$ seq -f “%06g” 5 | awk ‘BEGIN{srand()} {print $1,rand()*1000000}’ | sort -k2|awk ‘{print $1}’
000005
000001
000002
000004
000003

–//基本满足要求.不知道生成是否缓慢,因为如果执行seq -f “%06g” 300000,要调用rand() 3e5次呢?上班测试看看.

$ time seq -f “%06g” 300000 | awk ‘BEGIN{srand()} {print $1,rand()*1000000}’ | sort -k2|awk ‘{print $1}’ > bb.txt
real 0m1.858s
user 0m2.081s
sys 0m0.055s

$ head bb.txt ;tail bb.txt
245798
253547
034048
204117
136765
206247
231163
134263
214472
152697
104588
167604
023122
013733
161220
155133
284947
259982
057430
096936
–//OK,满足需求。