awk之随机函数rand()和srand()
分类: LINUX 文件: abcdefg
...... 现在想要随机抽取5列组成下面的内容,允许重复: 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.,所以需要乘以100得到21.,然后再对7取余,结果是0.,int()取整是0了,我们要获得1~7的随机数,所以加1,整个表达式才是 int(rand()*%+) ,其实 int(length*rand()+) 也是可以得到1~7的随机数的,只是在BEGIN中,length函数还是为0,这样就得到了肯定产生于1~7之间的随机数,问题在于rand()只产生一次,怎么让它滚动起来呢?这里我们还需要srand()函数,括号内没有表达式的话,它会采用当前时间作为随机计数器的种子,这样以秒为间隔,随机数就能滚动随机生成了。最后再对应数组a的随机值作为字段打印出来。 #!/bin/bash
len=""
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列嘛。然后从file文件中读入一行内容给变量 line ,定义一个长度为0的变量 str ,当 str 变量长度大于等于5了,就不再会继续whlie循环,然后打印该变量,在bash中 ${#var} 就是获取变量的长度,我们再看看怎么实现的随机,该shell的原理是读取 line 变量的随机0~6位置长度为1的字符,环境变量RANDOM,范围是0~,RANDOM对7取余的结果是0~,就能随机抽取长度为7的字符串中的任意一个字符,然后把该字符累计给变量 str ,满足长度5后就打印出该行。 谢谢Tim和shell_HAT的精彩代码。
 

最新文章

  1. ASP.NET WebForms MapPageRoute 路由配置
  2. RDBMS DML DDL
  3. 【bzoj1082】 SCOI2005—栅栏
  4. 动态创建MySQL数据库
  5. Object-c中间initialize 与 辛格尔顿
  6. think in uml-关系
  7. 设计模式 - 代理模式(jdk)
  8. jquerymobile实例介绍
  9. SQL外连接
  10. codeforces round #419 C. Karen and Game
  11. Nosql与关系型数据库不同的使用场景
  12. __x__(7)0905第二天__HTML的发展
  13. mybatis --- 如何相互转换逗号分隔的字符串和List
  14. What Are You Talking About HDU1075
  15. tomcat运行模式
  16. 常用处理数组、字符串API → forEach every some sort map filter slice split indexOf concat substring substr splice join toString replace
  17. android kl文件
  18. animate is not a function(zepto 使用报错)[转]
  19. 【WP8】WP8调用官方API使用LED灯
  20. win10 redis安装教程

热门文章

  1. IntelliJ IDEA下Maven控制台出现中文乱码问题解决
  2. Android 智能指针学习 一
  3. 【Git】GitHub for Windows使用(3) GitHub Flow的使用
  4. 十个Chatbot框架介绍
  5. adb logcat通过包名过滤(dos命令find后跟变量)
  6. http://blog.sina.com.cn/s/blog_628cc2b70102v115.html
  7. 【angularJS】前后台分离,angularJS使用Token认证
  8. SEO优化100条
  9. ipt_connlimit限制并发,ipt_recent限制单位时间内的请求数目
  10. 插件化注解处理API(Pluggable Annotation Processing API)