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

成都大型网站维护公司昆明网站建设公司哪家便宜

成都大型网站维护公司,昆明网站建设公司哪家便宜,桐乡住房和建设局网站,常见的互联网应用在 awk 系列的这篇总结中#xff0c;Daniel 向您介绍 awk 重要的字符串函数#xff0c;以及演示了如何从头开始编写完整的支票簿结算程序。在这个过程中#xff0c;您将学习如何编写自己的函数#xff0c;并使用 awk 的多维数组。学完本文之后#xff0c;您将掌握更多 awk…在 awk 系列的这篇总结中Daniel 向您介绍 awk 重要的字符串函数以及演示了如何从头开始编写完整的支票簿结算程序。在这个过程中您将学习如何编写自己的函数并使用 awk 的多维数组。学完本文之后您将掌握更多 awk 经验可以让您创建功能更强大的脚本。 格式化输出虽然大多数情况下 awk 的 print 语句可以完成任务但有时我们还需要更多。在那些情况下awk 提供了两个我们熟知的老朋友 printf() 和 sprintf()。是的如同其它许多 awk 部件一样这些函数等同于相应的 C 语言函数。printf() 会将格式化字符串打印到 stdout而 sprintf() 则返回可以赋值给变量的格式化字符串。如果不熟悉 printf() 和 sprintf()介绍 C 语言的文章可以让您迅速了解这两个基本打印函数。在 Linux 系统上可以输入 “man 3 printf” 来查看 printf() 帮助页面。 以下是一些 awk sprintf() 和 printf() 的样本代码。可以看到它们几乎与 C 语言完全相同。 x1b”foo”printf(”%s got a %d on the last test/n”,”Jim”,83)myout(”%s-%d”,b,x)print myout 此代码将打印 Jim got a 83 on the last testfoo-1 字符串函数awk 有许多字符串函数这是件好事。在 awk 中确实需要字符串函数因为不能象在其它语言如 C、C 和 Python中那样将字符串看作是字符数组。例如如果执行以下代码 mystring”How are you doing today?”print mystring[3] 将会接收到一个错误如下所示 awk: string.gawk:59: fatal: attempt to use scalar as array 噢好吧。虽然不象 Python 的序列类型那样方便但 awk 的字符串函数还是可以完成任务。让我们来看一下。 首先有一个基本 length() 函数它返回字符串的长度。以下是它的使用方法 print length(mystring) 此代码将打印值 24 好继续。下一个字符串函数叫作 index它将返回子字符串在另一个字符串中出现的位置如果没有找到该字符串则返回 0。使用 mystring可以按以下方法调用它 print index(mystring,”you”) awk 会打印 9 让我们继续讨论另外两个简单的函数tolower() 和 toupper()。与您猜想的一样这两个函数将返回字符串并且将所有字符分别转换成小写或大写。请注意tolower() 和 toupper() 返回新的字符串不会修改原来的字符串。这段代码 print tolower(mystring)print toupper(mystring)print mystring ……将产生以下输出 how are you doing today?HOW ARE YOU DOING TODAY?How are you doing today? 到现在为止一切不错但我们究竟如何从字符串中选择子串甚至单个字符那就是使用 substr() 的原因。以下是 substr() 的调用方法 mysubsubstr(mystring,startpos,maxlen) mystring 应该是要从中抽取子串的字符串变量或文字字符串。startpos 应该设置成起始字符位置maxlen 应该包含要抽取的字符串的最大长度。请注意我说的是最大长度如果 length(mystring) 比 startposmaxlen 短那么得到的结果就会被截断。substr() 不会修改原始字符串而是返回子串。以下是一个示例 print substr(mystring,9,3) awk 将打印 you 如果您通常用于编程的语言使用数组下标访问部分字符串以及不使用这种语言的人请记住 substr() 是 awk 代替方法。需要使用它来抽取单个字符和子串因为 awk 是基于字符串的语言所以会经常用到它。 现在我们讨论一些更耐人寻味的函数首先是 match()。match() 与 index() 非常相似它与 index() 的区别在于它并不搜索子串它搜索的是规则表达式。match() 函数将返回匹配的起始位置如果没有找到匹配则返回 0。此外match() 还将设置两个变量叫作 RSTART 和 RLENGTH。RSTART 包含返回值第一个匹配的位置RLENGTH 指定它占据的字符跨度如果没有找到匹配则返回 -1。通过使用 RSTART、RLENGTH、substr() 和一个小循环可以轻松地迭代字符串中的每个匹配。以下是一个 match() 调用示例 print match(mystring,/you/), RSTART, RLENGTH awk 将打印 9 9 3 字符串替换现在我们将研究两个字符串替换函数sub() 和 gsub()。这些函数与目前已经讨论过的函数略有不同因为它们确实修改原始字符串。以下是一个模板显示了如何调用 sub() sub(regexp,replstring,mystring) 调用 sub() 时它将在 mystring 中匹配 regexp 的第一个字符序列并且用 replstring 替换该序列。sub() 和 gsub() 用相同的自变量唯一的区别是 sub() 将替换第一个 regexp 匹配如果有的话gsub() 将执行全局替换换出字符串中的所有匹配。以下是一个 sub() 和 gsub() 调用示例 sub(/o/,”O”,mystring)print mystringmystring”How are you doing today?”gsub(/o/,”O”,mystring)print mystring 必须将 mystring 复位成其初始值因为第一个 sub() 调用直接修改了 mystring。在执行时此代码将使 awk 输出 HOw are you doing today?HOw are yOu dOing tOday? 当然也可以是更复杂的规则表达式。我把测试一些复杂规则表达式的任务留给您来完成。 通过介绍函数 split()我们来汇总一下已讨论过的函数。split() 的任务是“切开”字符串并将各部分放到使用整数下标的数组中。以下是一个 split() 调用示例 numelementssplit(”Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec”,mymonths,”,”) 调用 split() 时第一个自变量包含要切开文字字符串或字符串变量。在第二个自变量中应该指定 split() 将填入片段部分的数组名称。在第三个元素中指定用于切开字符串的分隔符。split() 返回时它将返回分割的字符串元素的数量。split() 将每一个片段赋值给下标从 1 开始的数组因此以下代码 print mymonths[1],mymonths[numelements] ……将打印 Jan Dec 特殊字符串形式简短注释 — 调用 length()、sub() 或 gsub() 时可以去掉最后一个自变量这样 awk 将对 $0整个当前行应用函数调用。要打印文件中每一行的长度使用以下 awk 脚本 {print length()} 财务上的趣事几星期前我决定用 awk 编写自己的支票簿结算程序。我决定使用简单的 tab 定界文本文件以便于输入最近的存款和提款记录。其思路是将这个数据交给 awk 脚本该脚本会自动合计所有金额并告诉我余额。以下是我决定如何将所有交易记录到 “ASCII checkbook” 中 23 Aug 2000 food - - Y Jimmy’s Buffet 30.25 此文件中的每个字段都由一个或多个 tab 分隔。在日期字段 1$1之后有两个字段叫做“费用分类帐”和“收入分类帐”。以上面这行为例输入费用时我在费用字段中放入四个字母的别名在收入字段中放入 “-”空白项。这表示这一特定项是“食品费用”。:) 以下是存款的示例 23 Aug 2000 - inco - Y Boss Man 2001.00 在这个实例中我在费用分类帐中放入 “-”空白在收入分类帐中放入 “inco”。”inco” 是一般薪水之类收入的别名。使用分类帐别名让我可以按类别生成收入和费用的明细分类帐。至于记录的其余部分其它所有字段都是不需加以说明的。“是否付清”字段”Y” 或 “N”记录了交易是否已过帐到我的帐户除此之外还有一个交易描述和一个正的美元金额。 用于计算当前余额的算法不太难。awk 只需要依次读取每一行。如果列出了费用分类帐但没有收入分类帐为 “-”那么这一项就是借方。如果列出了收入分类帐但没有费用分类帐为 “-”那么这一项就是贷方。而且如果同时列出了费用和收入分类帐那么这个金额就是“分类帐转帐”即从费用分类帐减去美元金额并将此金额添加到收入分类帐。此外所有这些分类帐都是虚拟的但对于跟踪收入和支出以及预算却非常有用。 代码现在该研究代码了。我们将从第一行BEGIN 块和函数定义开始 balance第 1 部分 #!/usr/bin/env awk -fBEGIN {FS”/t”months”Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec”} function monthdigit(mymonth) {return (index(months,mymonth)3)/4} 首先执行 “chmod x myscript” 命令那么将第一行 “#!…” 添加到任何 awk 脚本将使它可以直接从 shell 中执行。其余行定义了 BEGIN 块在 awk 开始处理支票簿文件之前将执行这个代码块。我们将 FS字段分隔符设置成 “/t”它会告诉 awk 字段由一个或多个 tab 分隔。另外我们定义了字符串 months下面将出现的 monthdigit() 函数将使用它。 最后三行显示了如何定义自己的 awk 。格式很简单 — 输入 “function”再输入名称然后在括号中输入由逗号分隔的参数。在此之后”{ }” 代码块包含了您希望这个函数执行的代码。所有函数都可以访问全局变量如 months 变量。另外awk 提供了 “return” 语句它允许函数返回一个值并执行类似于 C 和其它语言中 “return” 的操作。这个特定函数将以 3 个字母字符串格式表示的月份名称转换成等价的数值。例如以下代码 print monthdigit(”Mar”) ……将打印 3 现在让我们讨论其它一些函数。 财务函数以下是其它三个执行簿记的函数。我们即将见到的主代码块将调用这些函数之一按顺序处理支票簿文件的每一行从而将相应交易记录到 awk 数组中。有三种基本交易贷方 (doincome)、借方 (doexpense) 和转帐 (dotransfer)。您会发现这三个函数全都接受一个自变量叫作 mybalance。mybalance 是二维数组的一个占位符我们将它作为自变量进行传递。目前我们还没有处理过二维数组但是在下面可以看到语法非常简单。只须用逗号分隔每一维就行了。 我们将按以下方式将信息记录到 “mybalance” 中。数组的第一维从 0 到 12用于指定月份0 代表全年。第二维是四个字母的分类帐如 “food” 或 “inco”这是我们处理的真实分类帐。因此要查找全年食品分类帐的余额应查看 mybalance[0,”food”]。要查找 6 月的收入应查看 mybalance[6,”inco”]。 balance第 2 部分 function doincome(mybalance) {mybalance[curmonth,$3] amountmybalance[0,$3] amount} function doexpense(mybalance) {mybalance[curmonth,$2] - amountmybalance[0,$2] - amount} function dotransfer(mybalance) {mybalance[0,$2] - amountmybalance[curmonth,$2] - amountmybalance[0,$3] amountmybalance[curmonth,$3] amount} 调用 doincome() 或任何其它函数时我们将交易记录到两个位置 — mybalance[0,category] 和 mybalance[curmonth, category]它们分别表示全年的分类帐余额和当月的分类帐余额。这让我们稍后可以轻松地生成年度或月度收入支出明细分类帐。 如果研究这些函数将发现在我的引用中传递了 mybalance 引用的数组。另外我们还引用了几个全局变量curmonth它保存了当前记录所属的月份的数值$2费用分类帐$3收入分类帐和金额$7美元金额。调用 doincome() 和其它函数时已经为要处理的当前记录行正确设置了所有这些变量。 主块以下是主代码块它包含了分析每一行输入数据的代码。请记住由于正确设置了 FS可以用 $ 1 引用第一个字段用 $2 引用第二个字段依次类推。调用 doincome() 和其它函数时这些函数可以从函数内部访问 curmonth、$2、$3 和金额的当前值。请先研究代码在代码之后可以见到我的说明。 balance第 3 部分 {curmonthmonthdigit(substr($1,4,3))amount$7 #record all the categories encounteredif ( $2 ! “-” )globcat[$2]”yes”if ( $3 ! “-” )globcat[$3]”yes” #tally up the transaction properlyif ( $2 “-” ) {if ( $3 “-” ) {print “Error: inc and exp fields are both blank!”exit 1} else {#this is incomedoincome(balance)if ( $5 “Y” )doincome(balance2)}} else if ( $3 “-” ) {#this is an expensedoexpense(balance)if ( $5 “Y” )doexpense(balance2)} else {#this is a transferdotransfer(balance)if ( $5 “Y” )dotransfer(balance2)}} 在主块中前两行将 curmonth 设置成 1 到 12 之间的整数并将金额设置成字段 7使代码易于理解。然后是四行有趣的代码它们将值写到数组 globcat 中。globcat或称作全局分类帐数组用于记录在文件中遇到的所有分类帐 — “inco”、”misc”、”food”、”util” 等。例如如果 $2 “inco”则将 globcat[”inco”] 设置成 “yes”。稍后我们可以使用简单的 “for (x in globcat)” 循环来迭代分类帐列表。 在接着的大约二十行中我们分析字段 $2 和 $3并适当记录交易。如果 $2”-” 且 $3!”-”表示我们有收入因此调用 doincome()。如果是相反的情况则调用 doexpense()如果 $2 和 $3 都包含分类帐则调用 dotransfer()。每次我们都将 “balance” 数组传递给这些函数从而在这些函数中记录适当的数据。 您还会发现几行代码说“if ( $5 “Y” )那么将同一个交易记录到 balance2 中”。我们在这里究竟做了些什么您将回忆起 $5 包含 “Y” 或 “N”并记录交易是否已经过帐到帐户。由于仅当过帐了交易时我们才将交易记录到 balance2因此 balance2 包含了真实的帐户余额而 “balance” 包含了所有交易不管是否已经过帐。可以使用 balance2 来验证数据项因为它应该与当前银行帐户余额匹配可以使用 “balance” 来确保没有透支帐户因为它会考虑您开出的尚未兑现的所有支票。 生成报表主块重复处理了每一行记录之后现在我们有了关于比较全面的、按分类帐和按月份划分的借方和贷方记录。现在在这种情况下最合适的做法是只须定义生成报表的 END 块 balance第 4 部分 END {bal0bal20for (x in globcat) {balbalbalance[0,x]bal2bal2balance2[0,x]}printf(”Your available funds: %10.2f/n”, bal)printf(”Your account balance: %10.2f/n”, bal2)} 这个报表将打印出汇总如下所示 Your available funds:1174.22Your account balance:2399.33 在 END 块中我们使用 “for (x in globcat)” 结构来迭代每一个分类帐根据记录在案的交易结算主要余额。实际上我们结算两个余额一个是可用资金另一个是帐户余额。要执行程序并处理您在文件 “mycheckbook.txt” 中输入的财务数据将以上所有代码放入文本文件 “balance”执行 “chmod x balance”然后输入 “./balance mycheckbook.txt”。然后 balance 脚本将合计所有交易打印出两行余额汇总。 升级我使用这个程序的更高级版本来管理我的个人和企业财务。我的版本由于篇幅限制不能在此涵盖会打印出收入和费用的月度明细分类帐包括年度总合、净收入和其它许多内容。它甚至以 HTML 格式输出数据因此我可以在 Web 浏览器中查看它。:) 如果您认为这个程序有用我建议您将这些特性添加到这个脚本中。不必将它配置成要 记录任何附加信息所需的全部信息已经在 balance 和 balance2 里面了。只要升级 END 块就万事具备了 我希望您喜欢本系列。有关 awk 的详细信息请参考以下列出的参考资料。
http://wiki.neutronadmin.com/news/95977/

相关文章:

  • 网上做结婚照的网站wordpress官网登录
  • 怎么让百度收录网站有九类商标可以做网站名吗
  • 东莞专业网站建设公司销量最高的wordpress模版
  • 网站制作服务合同网页版qq登录入口电脑版
  • 网站怎么做脚注域名com和cn的区别
  • 做网站的具体内容高端专区
  • 谷歌seo快速排名优化方法关键词优化排名详细步骤
  • 百度收录什么网站吗企业vi设计主要包括哪些内容
  • 完成网站集约化建设腾讯云服务器用户名
  • 我想自己卖特产怎么做网站企业网站未来发展趋势
  • 建设信用卡申请官方网站网站制作方案的重要性
  • 做网站服务好网站建设属于技术开发合同吗
  • wordpress 古今肇庆seo排名
  • 如何创办自己的网站sync wordpress
  • 越秀区网站建设背景wordpress
  • 新乡网站建设哪家好源汇区建设局网站
  • 中国做网站推广哪家好苏州的网站建设公司
  • 博野网站建设培训制作网站源码
  • 网站pv uv是什么意思深圳网站建设设
  • 做自媒体与做网站网站建设综合实训
  • 具有营销价值好的网站丹阳市建设局网站
  • 做网站用什么系统较好广东官网网站建设平台
  • 做外贸一般上哪些网站小程序微信如何开发
  • 网站信息内容建设自查报告文化宣传 加强网站建设 创办网站
  • 大型网站建设的必须条件怎么做网站建设
  • 培训教材网站建设wordpress wp.net
  • 网站运营及推广17做网店类似网站
  • 江西医院网站建设天体摄影
  • 商城网站建设公司工作室是个体户还是公司
  • 北京公司网站设计做地税电子签章的网站