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

AWK语言第二版 2.6个人库 2.7小结

2.6 个人库

Awk提供了适量的内置函数库,如 lengthsubsubstrprintf 等其他十来个;在A.2.1节的参考手册中都有列出。你可以自己创建更多函数,以便有需要时引入到Awk程序中。比如内置库函数 sub gsub 都只能返回替换的次数,而你可以用它们来写自己的字符串替换函数,把返回改成替换后的字符串。本节还会给出少量样例,都是这些年来我们认为很有用的。

函数 rest(n) 返回从第n个域开始的所有输入域。

# rest(n): 返回一个字符串,包含 第n到第NF个域,用空格分隔function rest(n,   s) {s = ""while (n <= NF)s = s $n++ " "return substr(s, 1, length(s)-1)  # 删除末尾空格
}# 测试下:
{ for (i = 0; i<= NF+1; i++)printf("%3d [%s]\n", i, rest(i))
}

注意:由于$符号的优先级比++高,s = s $n++ " "  这一行要改为 s = s $(n++) " " 才能正常运行,否则会陷入死循环。原书代码有问题。

函数 rest 有个局部变量 s。Awk中没有变量声明,因此只要是调用者没有提供的参数,都会被当作函数的局部变量(很遗憾,这是语言设计的糟糕之处)。在本例中,调用 rest 的时候只带了一个参数 n ,所以第二个参数 s,就是函数内的局部变量。

按惯例,我们在写函数声明的时候,都会在局部变量名前面多加些空格,这样可以把参数和局部变量区分清楚。还有一种做法是使用容易区分的名字,比如用下划线做前缀或后缀:

function rest(n,   _s) {_s = ""while (n <= NF)_s = _s $(n++) " "return substr(_s, 1, length(_s)-1)
}

不过这样看起来会有点难受。

当然还有一种做法,是在所有局部变量前面,加上一个不用的参数,比如 locals 或者下划线_。上面这三种方法都是针对糟糕的语言设计,做出的不完美的变通。

你还可以自己写一些 rest 的变种函数,比如写个 subfields(m, n) 返回从第m 到 第n 的连续域的序列,或者写个 join 把一个数组中的所有值变成空格分隔的序列,或者把一个数组转换成JSON对象:

{"name": "value", ...}

如果你使用标准Awk,那就不得不手动拷贝这些函数到你的程序里面,这实际就是复制粘贴:很简单但是有风险。A.5.4节的参考手册里有个 include 程序。或者可以使用多个 -f 参数来包含多个Awk 源文件。

日期格式化

本章前面2.5节的例子里使用的日期格式为 mm/dd/yy,这是美国的使用习惯,但与其他地方不一样,而且很难对这种格式做排序或其他数学计算。我们能很轻松写出一个 datefix 函数来把这种格式转换成ISO标准格式 yyyy-mm-dd,这样的话数据就能直接用日期来排序了。

# datefix: 把 mm/dd/yy 转换成 yyyy-mm-dd (从1940年到2039年)awk '
function datefix(s,   y, date) {split(s, date, "/")y = date[3]<40 ? 2000+date[3] : 1900+date[3]  # 任意年份return sprintf("%4d-%02d-%02d", y, date[1], date[2])
}{ print(datefix($0)) }
' $*$ datefix
12/25/23
2023-12-25

Awk内置函数 split (s, arr, sep) 用分隔符 sep 将字符串 s 分割到数组 arr 中。元素编号从1开始,split 返回元素的个数。分隔符是正则表达式,可以写成字符串形式如 "sep" ,或是用斜杠包围如 /sep/。如果没有 sep 参数,且传给Awk程序的参数里包含了 --csv,则字符串以CSV格式进行分割;否则,就使用域分隔符变量 FS(见A.5.2节) 来进行分割。有一种特殊情况:如果 sep 是空字符串 "" 或空正则表达式 //,则字符串会被分割成单个字符,即每个数组元素一个字符。

上面的代码用了一个比较随意的规则来将两位数的年份转换成四位数的:如果小于40,则认为是20xx年,否则认为是19xx年。

运算符 ?: 的语法为 表达式1 ? 表达式2 : 表达式3,与C语言一样。它对表达式1求值,如果为真,则结果为表达式2,否则为表达式3;只会对表达式2和3中的一个求值。实际上 ?: 是能用在表达式里面的 if-else 的紧凑写法。它非常方便,但很容易被滥用,造成代码难以读懂。

最后,注意 sprintf 中的转换:%02d 用两位宽度来打印整数,位数不足时在前面补0。

假如我们想要从本地操作系统中获取当前的日期和时间,我们可以使用Unix命令 date,然后将它的返回内容重新格式化。最简单的方法是在Awk里运行 date,并将它的输出管道化给Awk的 getline 函数,这个函数从文件或管道中读取输入:

"date" | getline date    # 获取当前日期和时间
split(date, d, / /)      # 用字符串 " " 也可以
date = d[2] " " d[3] ", " d[6]

只要一点点处理就能将这种日期格式:

Wed Jul 12 07:16:19 EDT 2023

转换成下面的格式:(注意:如果日期是一位数,d[3]会是空字符,d[4]才是日期,年份是[7])

Jul 12, 2023

也可以转换成你想要的任意格式,可能会用上前面的 datefix 函数。

getline 命令和管道的更多细节参见 A.5.4。

假定你要把月份转换成数字,Jan是1,Feb是2,等等。可以使用一系列赋值语句来做,比如m["Jan"]=1, m["Feb"]=2, 以此类推,但这样写起来太繁琐了。一个不错的替代方案是写个函数,把字符串拆到索引数组中,如下:

# isplit - 用str构造索引数组function isplit(str, arr,   n, i, temp) {n = split(str, temp)for (i = 1; i <= n; i++)arr[temp[i]] = ireturn n
}

 isplit 函数很像 split,区别是它构造出来的数组下标是字符串里面的单词,而对应的值是单词在字符串中的索引。执行如下语句后

isplit("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", m)

m["Jan"] 的值是1,而m["Dec"]的值是12。

前面说过,split函数可以有第三个参数,是一个正则表达式。你可以对 isplit 做扩展,(以字符串方式)对 isplit 函数传入这个参数。

练习2-5、写个tomorrow脚本,以合适的格式打印出明天的日期。

练习2-6、写出返回修改后的字符串的 sub gsub 版本,类似Python的 re.sub函数。

 2.7 小结

我们在本章展示了一些个人认为有用的脚本。很可能大部分都不是读者直接想要的,但我们希望它们能在你自己写程序时带来一些启发,而且这些样例中展示了不少技巧,会让你编程更轻松。

本章的例子大部分是基于如下内容的组合:计算相关数值的算术表达式,储存信息的数组,以及封装计算的函数。这些机制是编程中至关重要的。在Awk里使用它们特别容易,因为Awk就是围绕它们来设计的,但同样的方法在其他语言里也是无价的,非常值得你花时间来掌握。

第二章完

相关文章:

AWK语言第二版 2.6个人库 2.7小结

2.6 个人库 Awk提供了适量的内置函数库&#xff0c;如 length、sub、substr、printf 等其他十来个&#xff1b;在A.2.1节的参考手册中都有列出。你可以自己创建更多函数&#xff0c;以便有需要时引入到Awk程序中。比如内置库函数 sub 和 gsub 都只能返回替换的次数&#xff0c…...

8年经验之谈 —— Web ui自动化测试框架总结!

实施过了web系统的UI自动化&#xff0c;回顾梳理下&#xff0c;想到什么写什么&#xff0c;随时补充。 首先&#xff0c;自动化测试不是手动测试的替代品&#xff0c;是比较好的补充&#xff0c;而且不是占大比重的补充。 70%的测试工作集中在底层接口测试和单元测试&#xff0…...

Kafka在企业级应用中的实践

前言 前面说了很多Kafka的性能优点&#xff0c;有些童鞋要说了&#xff0c;这Kafka在企业开发或者企业级应用中要怎么用呢&#xff1f;今天咱们就来简单探究一下。 1、 使用 Kafka 进行消息的异步处理 Kafka 提供了一个可靠的消息传递机制&#xff0c;使得企业能够将不同组件…...

使用企业订货系统后的效果|软件定制开发|APP小程序搭建

使用企业订货系统后的效果|软件定制开发|APP小程序搭建 企业订货系统是一种高效的采购管理系统&#xff0c;它可以帮助企业更好地管理采购流程&#xff0c;降低采购成本&#xff0c;提高采购效率。 可以帮助企业提高销售效率和降低成本的软件工具。使用该系统后&#xff0c;企业…...

STL关联式容器set,multiset,pair,map

set容器是一个集合容器。包含元素是唯一的。集合元素按照一点顺序排列&#xff0c;元素插入过程是顺序插入&#xff0c;所有不能插入指定位置。 set采用红黑树变体的数据结构实现。红黑树属于平衡二叉树。再插入和删除上比vector快。 set不能直接存取元素&#xff08;不能用a…...

MFC文本输出学习

void CTxttstView::OnDraw(CDC* pDC) {CTxttstDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;pDC->SetBkColor(RGB(0,0,0));pDC->TextOut(50, 50, "一段文字");pDC->SetBkColor(RGB(255,255,255))…...

Python 数据分析与挖掘(一)

Python 数据分析与挖掘&#xff08;数据探索&#xff09; 数据探索 1.1 需要掌握的工具&#xff08;库&#xff09; 1.1.1 Nump库 Numpy 提供多维数组对象和各种派生对象&#xff08;类矩阵&#xff09;&#xff0c;利用应用程序接口可以实现大量且繁琐的数据运算。可以构建…...

【问题证明】矩阵方程化为特征值方程求得的特征值为什么是全部特征值?不会丢解吗?

问题 这个问题困扰了我好久&#xff0c;一直感觉如果有其他的特征值没法证伪&#xff0c;不过一直存在思想的层面&#xff0c;没有实际解决&#xff0c;今天突然想到动笔来解决&#xff0c;遂得解&#xff0c;证明如下。 证明 总结 这个证明看似证明过后很直观&#xff0c;但…...

虹科干货 | 不是吧,Redis Enterprise也能当向量数据库来用?

什么是向量相似性搜索啊&#xff1f; 例如&#xff0c;你需要搜索一棵发财树的图片&#xff0c;如果用传统数据库来检索&#xff0c;你大概率会在茫茫树丛中错失心仪的发财树。但是&#xff0c;向量相似性搜索能用向量来表示所有树的特征&#xff0c;这样就能够通过计算向量之间…...

汽车驾驶 - 四梁六柱是什么

汽车的四梁六柱指的是车辆的两个前纵梁&#xff0c;两个后纵梁和ABC柱。虽然不像车辆上的发动机变速箱这些部件出镜率那么高&#xff0c;但这几个部位的重要作用可一点都不含糊。一辆车在碰撞时能够受力起到保护左右的就是四梁六柱&#xff0c;对我们汽车的安全性起到至关重要的…...

CI522 13.56MHZ电动车NFC测试资料

Ci522是一颗工作在13.56MHz频率下的非接触式读写芯片&#xff0c;支持读A卡&#xff08;CI523支持读A/B卡&#xff09;&#xff0c;可做智能门锁、电动车NFC一键启动、玩具NFC开锁等应用。为部分要求低成本&#xff0c;PCB小体积的产品提供了可靠的选择。 Ci522与Si522/MFRC52…...

【微信小程序开发】一文学会使用CSS样式布局与美化

引言 在微信小程序开发中&#xff0c;CSS样式布局和美化是非常重要的一部分&#xff0c;它能够为小程序增添美感&#xff0c;提升用户体验。本文将介绍如何学习使用CSS进行样式布局和美化&#xff0c;同时给出代码示例&#xff0c;帮助开发者更好地掌握这一技巧。 一、CSS样式布…...

漏刻有时物联网环境态势感知大数据(设备列表、动态折线图)

物联网环境下的态势感知是指对物联网环境中的各种要素进行全面、实时、准确的监测、分析和预测,以实现网络态势的全面掌握和安全威胁的及时响应和处理。具体而言,态势感知以物联网环境为基础,利用各类传感器、数据采集设备和其他相关工具,对物联网设备、资产、数据流等进行…...

【力扣】单调栈:901. 股票价格跨度

【力扣】单调栈&#xff1a;901. 股票价格跨度 文章目录 【力扣】单调栈&#xff1a;901. 股票价格跨度1. 题目介绍2. 思路3. 解题代码参考 1. 题目介绍 设计一个算法收集某些股票的每日报价&#xff0c;并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格…...

4_使用预训练模型 微调训练CIFAR10

使用预训练模型 微调训练CIFAR10 1. VGG 准备工作import torch from torch import nn import torchvision from torchvision import models from torchvision import datasets, transforms from datetime import datetime from tqdm import tqdm from torchsummary import sum…...

机器学习笔记(一)

1.线性回归模型 2. 损失函数 3.梯度下降算法 多元特征的线性回归 当有多个影响因素的时候,公式可以改写为: 当有多个影响因素的时候为了方便计算,可以使用 Numpy下面的点积方法, np.dot(w,x) 最后再加个b 就省略了很多书写步骤,这叫做矢量化 多元回归的梯度下降 左边是一…...

学习在原地打转的原因与解决 如何步步为营 一日千里快速进步 考研工程计算 1万小时=416.666666667 天

学习在原地打转的原因可能有很多。以下是一些常见的原因&#xff1a; 缺乏明确的目标&#xff1a;如果没有明确的学习目标&#xff0c;人们往往会感到迷失和困惑。没有一个明确的方向&#xff0c;就很难做出有针对性的努力&#xff0c;从而导致学习进展缓慢。 学习方法不当&a…...

194、SpringBoot --- 下载和安装 Erlang 、 RabbitMQ

本节要点&#xff1a; 一些命令&#xff1a; 小黑窗输入&#xff1a; rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗&#xff1a; rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问 htt…...

机器学习7:pytorch的逻辑回归

一、说明 逻辑回归模型是处理分类问题的最常见机器学习模型之一。二项式逻辑回归只是逻辑回归模型的一种类型。它指的是两个变量的分类&#xff0c;其中概率用于确定二元结果&#xff0c;因此“二项式”中的“bi”。结果为真或假 — 0 或 1。 二项式逻辑回归的一个例子是预测人…...

Java应用程序中如何实现FTP功能 | 代码示例和教程

原为地址&#xff1a;https://www.toymoban.com/diary/java/363.html 在Java应用程序中实现FTP功能需要使用FTPClient类和相关方法。下面是实现三个主要功能的示例代码&#xff1a; 1&#xff09;显示FTP服务器上的文件&#xff1a; void ftpList_actionPerformed(ActionEv…...

kotlin:list的for循环

代码&#xff1a; var list { "a", "b", "c" } for (i in list.indices) {print("app"i""list[i]) }...

asp.net电影院选座系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net电影院选座系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net电影院选座系统1 二、功能介…...

CSS鼠标指针表

(机翻)搬运自:cursor - CSS: Cascading Style Sheets | MDN (mozilla.org) 类型Keyword演示注释全局autoUA将基于当前上下文来确定要显示的光标。例如&#xff0c;相当于悬停文本时的文本。default 依赖于平台的默认光标。通常是箭头。none不会渲染光标。链接&状态contex…...

树的基本概念及二叉树

目录 一、树的基本概念 &#xff08;1&#xff09;树的结点 &#xff08;2&#xff09;度 &#xff08;3&#xff09;结点层次 &#xff08;4&#xff09;树的高度 树的特点&#xff1a; 二、二叉树 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完…...

BUUCTF Basic 解题记录--BUU XXE COURSE

1、XXE漏洞 初步学习&#xff0c;可参考链接&#xff1a; 一篇文章带你深入理解漏洞之 XXE 漏洞 - 先知社区 2、了解了XXE漏洞&#xff0c;用burpsuite获取到的url转发给repeater&#xff0c;修改XML的信息&#xff0c;引入外部实体漏洞&#xff0c;修改发送内容&#xff0c;…...

kotlin:LogKit

看到别人的一个代码&#xff0c;觉得有点意思&#xff0c;就复制过来。 package robatimport android.util.Log import java.util.*object LogKit {private val MIN_STACK_OFFSET 3var defaultTag "LogKit"private val lineSeparator System.getProperty("l…...

yolo_tracking中osnet不支持.pth格式,而model_zoo中仅有.pth

yolo_traking-7.0中REID模块用到了osnet&#xff0c;track.py中模型文件不支持.pth&#xff0c;而model_zoo中仅有.pth&#xff0c;改动代码太麻烦了&#xff0c;网上查到的.pth文件转化为.pt文件都需要读取网络架构&#xff0c;不太可能实现。 读取osnet_x0_25_msmt17.pth发现…...

Tailwind CSS浅析与实操

Tailwind CSS 一、Tailwind CSS简介 What is Tailwind CSS Tailwind CSS| TailwindCSS中文文档 | TailwindCSS中文网官方解释&#xff1a;只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。本质上是一个工具集&#xff0c;包含了大量类似 fle…...

Activiti工作流引擎详解与应用

一、简介 Activiti是一个开源的工作流引擎&#xff0c;基于BPMN2.0标准进行流程定义。它可以将业务系统中复杂的业务流程抽取出来&#xff0c;使用专门的建模语言BPMN2.0进行定义&#xff0c;业务流程按照预先定义的流程进行执行&#xff0c;实现了系统的流程由Activiti进行管…...

New Journal of Physics:不同机器学习力场特征的准确性测试

文章信息 作者&#xff1a;Ting Han1, Jie Li1, Liping Liu2, Fengyu Li1, * and Lin-Wang Wang2, * 通信单位&#xff1a;内蒙古大学物理科学与技术学院、中国科学院半导体研究所 DOI&#xff1a;10.1088/1367-2630/acf2bb 研究背景 近年来&#xff0c;基于DFT数据的机器学…...

wordpress 前端个人中心 ajax 订单 支付宝/网站注册地址查询

问题描述 配置完静态IP&#xff0c;重启网卡失效&#xff0c; 且eth0网卡的信息看不到。 尝试一 /etc/init.d/networking start|stop&#xff0c;测试结果表明stop|start可用性更差。 执行sudo /etc/init.d/networking stop后&#xff0c;除了loopback其它网卡都被停掉&a…...

钓鱼网站教程/河南网站建设制作

1.关系型数据库简单的可以理解为二维数据库&#xff0c;表的格式就如Excel&#xff0c;有行有列。常用的关系数据库有Oracle&#xff0c;SqlServer&#xff0c;Informix&#xff0c;MySql&#xff0c;SyBase等。&#xff08;也即是我们平时看到的数据库&#xff0c;都是关系型数…...

自己做网站要买服务器吗/seo哪家强

编写帮助文档除了内容之外&#xff0c;如何呈现给用户也很重要&#xff0c;专业的形象有助于帮助用户更快的上手使用&#xff0c;并且建立专业形象&#xff0c;可能你的帮助文档内容来源各个地方&#xff0c;但最终&#xff0c;每个知识库都需要自己的样式指南&#xff0c;你可…...

普陀做网站价格/广州做seo整站优化公司

原子变量构建高效的非阻塞算法 非阻塞算法被广泛用于在操作系统和JVM中实现线程/进度调度机制、垃圾回收机制以及锁和其他并发数据结构。 非阻塞算法可以使多个线程在竞争相同的数据时不会发生阻塞&#xff0c;因此它能在粒度更细的层次协调&#xff0c;并且极大地减少调度开销…...

如何建设一个公众号电影网站/aso推广优化

原标题&#xff1a;废水中氨氮超标的原因氨氮超标的危害及后果废水中氨氮是指以氨或铵离子形式存在的化合氮&#xff0c;即污水中以游离氨(NH3)和铵离子(NH4)形式存在的氮。高浓度废水的氨氮在没有经过严格处理后&#xff0c;直接排放到大自然水体&#xff0c;会导致水体的富营…...

暴雪网易2023后不代理了/seo外包费用

查看自己的ip和采用什么方式上网(网通/电信)http://www.whatchina.com/html/sip.asp本文转自 xcf007 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/xcf007/161180&#xff0c;如需转载请自行联系原作者...