当前位置: 首页 > news >正文

awk之随机函数rand()和srand()

 awk之随机函数rand()和srand() 
分类: LINUX

 

文件:
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.7788int()取整是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后就打印出该行。
 
谢谢Tim和shell_HAT的精彩代码。

 

 

转载于:https://www.cnblogs.com/archoncap/p/4964005.html

相关文章:

  • python-socket
  • 传中青宝挖角乐港热血核心团队建新公司
  • java---Unicode-字符转换器
  • 无语:SEGA开发尿尿游戏 仅供男性专用
  • 什么是元数据(Metadata)?
  • jQuery-1.9.1源码分析系列(八) 属性操作
  • nginx 安装
  • 多级BOM
  • 回来了
  • Android Studio插件之FindBugs
  • cocoa pods
  • Array类编程
  • web前端_跨域问题方法总结
  • SQL SERVER中查找某关键词位于哪些存储过程或函数
  • EBS R12.2快速安装前没有配置Global Inventory报错
  • 分享一款快速APP功能测试工具
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • android图片蒙层
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • input实现文字超出省略号功能
  • Intervention/image 图片处理扩展包的安装和使用
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JavaScript服务器推送技术之 WebSocket
  • Wamp集成环境 添加PHP的新版本
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 警报:线上事故之CountDownLatch的威力
  • 盘点那些不知名却常用的 Git 操作
  • 实习面试笔记
  • 使用 Docker 部署 Spring Boot项目
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 写代码的正确姿势
  • 一个SAP顾问在美国的这些年
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • HanLP分词命名实体提取详解
  • 第二十章:异步和文件I/O.(二十三)
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • !!Dom4j 学习笔记
  • #define、const、typedef的差别
  • #Z2294. 打印树的直径
  • $.proxy和$.extend
  • (2)STM32单片机上位机
  • (3)nginx 配置(nginx.conf)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (转)用.Net的File控件上传文件的解决方案
  • **PHP二维数组遍历时同时赋值
  • ..回顾17,展望18
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET Core 2.1路线图
  • .NET DataGridView数据绑定说明
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 指南:抽象化实现的基类
  • .NET基础篇——反射的奥妙
  • .NET框架