文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档> 用awk自动创建格式化文本

用awk自动创建格式化文本

时间:2006-12-18  来源:hellofalcon

Declaration  

  该文为本人原创,如需转载,请著名原作者和本站地址,但未经本人同意,严禁用于商业途径。
  整理自我的另外一个博客,有删减。
  原文地址:http://oss.lzu.edu.cn/blog/blog.php?do_showone/tid_844.html

Text

  昨天在学习<Unix shells by example>的时候,后面有一些练习需要做,但是,练习上的文本是很规范的,可我懒得自己抄,于是想到:是不是可以自动生成这些规格化的文本呢?这样的话,做实验的时候用的文本就不用自己一行一行输入拉。
  答案是可以的,只要一个随机函数就可以拉。刚开始找shell里头的随机函数,没有找到[1],今天突然发现awk本身就提供了一对用来生成随机数的函数:srand和rand,前者用来生成随机数的种子,后者用来产生0到1之间的随机数。
  那怎么生成文本?很简单,先定义一个字母数组、一个数字数组,然后,用随机数当下标,自然就可以输入一个随机的规格化的文本拉。另外,如果引入split函数就可以直接先定义字母字符串和数字字符串拉。当然,这些串需要一个分割符。我们下面用的是空格。
  下面的代码,是shell和awk混用的,具体就不怎么解释拉,由于学awk不久,估计有些地方比较弱智,欢迎批评指正:
  
Code

#!/bin/bash

#filename: makefile.sh

#function: make a normalized file automaticly for doing awk experiment

#author: falcon

#email: zhangjin[at]gmail.com

#date: 2006-11-21


if [[ "$1" == "" ]]
then
    echo "Usage: bash makefile.sh file_lines_number"
    exit
fi

echo "" | awk '
function print_randlen_chars (min_num, max_num, source_chars_arr, source_chars_num) {
    dest_chars_num = min_num+int(rand()*(max_num-min_num))
    for ( i = 1; i <= dest_chars_num; i ++) {
        suffix=1+int(rand()*source_chars_num)
        ch = source_chars_arr[suffix]
        if (i > 1) printf(ch)
        else printf(toupper(ch))
    }
}

function print_chars(min_num, max_num) {
    print_randlen_chars (min_num, max_num, letters_arr, 25);
}

function print_numbers(min_num, max_num) {
    print_randlen_chars (min_num, max_num, numbers_arr, 9);
}

function print_char (ch) {
    printf("%c", ch)
}

#Mike Harrington:(510) 548-1278:250:100:175
function print_lines(line_num) {
    for ( j = 1; j <= line_num; j ++) {
        print_chars(3, 6);print_char(" ");print_chars(4, 10);
        print_char(":")
        print_char("(");print_numbers(3, 3);print_char(")");
        print_char(" ")
        print_numbers(3, 3);print_char("-");print_numbers(4,4)
        print_char(":")print_numbers(3, 3);print_char(":");print_numbers(3, 3);print_char(":");print_numbers(3, 3)
        print_char("\n")
    }
}

{
    letters="a b c d e f g h i j k l m n o p q r s t u v w x y z"
    numbers="0 1 2 3 4 5 6 7 8 9"
    split(letters, letters_arr, " ")
    split(numbers, numbers_arr, " ")
    srand()

    print_lines('$1')
}'


Demo

shell> bash makefile.sh 10
Yaqjy Kbjbfv:(734) 646-6145:312:448:430
Irsm Lvhbufkrm:(116) 677-2228:824:141:226
Lheqm Moaxv:(128) 485-6216:025:628:682
Pkc Prkfp:(633) 213-2507:287:848:556
Xyu Wffa:(864) 182-1826:541:342:570
Dlriq Qjinhe:(822) 215-8041:728:636:457
Tjrp Rycglr:(770) 507-2286:237:514:174
Fqro Avnnja:(100) 347-3201:526:377:160
Ncqxx Xklp:(705) 168-4573:022:828:708
Byc Cxcqmik:(462) 114-8476:208:675:637
  
  生成的文本是很规范的,这样我们就可以用来做awk实验拉,当然还可以用来做其他的实验,比如sed, grep等。另外,也可以用来创建用于mysql等数据库的测试数据。
  如果需要生成其他格式的文本,只需要修改funciton print_lines里循环部分的内容拉。
  确实要用的时候别忘了把生成的文本重定向到自己需要用来实验的文本里头去哦!
  实际上,这是一个非常不错的“想法”。在有的情况下,特别是测试的时候,需要产生大量的符合一定要求的测试数据,那么我们就可以通过随机数来产生它们了。

Remark

[1] 后来kangkang兄提示bash里头有个产生随机数的环境变量,即RANDOM,你可以直接用echo $RANDOM输出看看结果。另外,c、java等语言都提供了产生随机数的函数。

Extention

[1] 均匀分布的伪随机数发生器
http://blog.chinaunix.net/u/21948/showart_198480.html
[2] awk可以称得上是一门数据库语言。它可以轻松的操作一万条左右记录的数据,而且可以实现创建、删除、筛选、排序等常规的记录操作。因此,如果引入一个用shell实现的SQL语言解释器,把SQL语言解释成awk语言(以及其他一些常见命令,包括sed,grep,sort等),那么就可以实现一个纯粹Shell下的SQL语言,从而可以用于嵌入式等系统中,却无须安装额外库。因此,我产生了实现一个ShellSql项目的想法,欢迎大家和我一起探讨。我在原文中已经做了一些测试,更多的测试和项目进展将在这个博客进行,欢迎您的关注。
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载