AWK语言第二版 2.6个人库 2.7小结
2.6 个人库
Awk提供了适量的内置函数库,如 length、sub、substr、printf 等其他十来个;在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提供了适量的内置函数库,如 length、sub、substr、printf 等其他十来个;在A.2.1节的参考手册中都有列出。你可以自己创建更多函数,以便有需要时引入到Awk程序中。比如内置库函数 sub 和 gsub 都只能返回替换的次数,…...

8年经验之谈 —— Web ui自动化测试框架总结!
实施过了web系统的UI自动化,回顾梳理下,想到什么写什么,随时补充。 首先,自动化测试不是手动测试的替代品,是比较好的补充,而且不是占大比重的补充。 70%的测试工作集中在底层接口测试和单元测试࿰…...

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

使用企业订货系统后的效果|软件定制开发|APP小程序搭建
使用企业订货系统后的效果|软件定制开发|APP小程序搭建 企业订货系统是一种高效的采购管理系统,它可以帮助企业更好地管理采购流程,降低采购成本,提高采购效率。 可以帮助企业提高销售效率和降低成本的软件工具。使用该系统后,企业…...
STL关联式容器set,multiset,pair,map
set容器是一个集合容器。包含元素是唯一的。集合元素按照一点顺序排列,元素插入过程是顺序插入,所有不能插入指定位置。 set采用红黑树变体的数据结构实现。红黑树属于平衡二叉树。再插入和删除上比vector快。 set不能直接存取元素(不能用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 数据分析与挖掘(数据探索) 数据探索 1.1 需要掌握的工具(库) 1.1.1 Nump库 Numpy 提供多维数组对象和各种派生对象(类矩阵),利用应用程序接口可以实现大量且繁琐的数据运算。可以构建…...

【问题证明】矩阵方程化为特征值方程求得的特征值为什么是全部特征值?不会丢解吗?
问题 这个问题困扰了我好久,一直感觉如果有其他的特征值没法证伪,不过一直存在思想的层面,没有实际解决,今天突然想到动笔来解决,遂得解,证明如下。 证明 总结 这个证明看似证明过后很直观,但…...

虹科干货 | 不是吧,Redis Enterprise也能当向量数据库来用?
什么是向量相似性搜索啊? 例如,你需要搜索一棵发财树的图片,如果用传统数据库来检索,你大概率会在茫茫树丛中错失心仪的发财树。但是,向量相似性搜索能用向量来表示所有树的特征,这样就能够通过计算向量之间…...

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

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

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

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

【力扣】单调栈:901. 股票价格跨度
【力扣】单调栈:901. 股票价格跨度 文章目录 【力扣】单调栈:901. 股票价格跨度1. 题目介绍2. 思路3. 解题代码参考 1. 题目介绍 设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格…...
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 天
学习在原地打转的原因可能有很多。以下是一些常见的原因: 缺乏明确的目标:如果没有明确的学习目标,人们往往会感到迷失和困惑。没有一个明确的方向,就很难做出有针对性的努力,从而导致学习进展缓慢。 学习方法不当&a…...

194、SpringBoot --- 下载和安装 Erlang 、 RabbitMQ
本节要点: 一些命令: 小黑窗输入: rabbitmq-plugins enable rabbitmq_management 启动控制台插件 rabbitmq-server 启动rabbitMQ服务器 管理员启动小黑窗: rabbitmq-service install 添加rabbitMQ为本地服务 启动浏览器访问 htt…...

机器学习7:pytorch的逻辑回归
一、说明 逻辑回归模型是处理分类问题的最常见机器学习模型之一。二项式逻辑回归只是逻辑回归模型的一种类型。它指的是两个变量的分类,其中概率用于确定二元结果,因此“二项式”中的“bi”。结果为真或假 — 0 或 1。 二项式逻辑回归的一个例子是预测人…...
Java应用程序中如何实现FTP功能 | 代码示例和教程
原为地址:https://www.toymoban.com/diary/java/363.html 在Java应用程序中实现FTP功能需要使用FTPClient类和相关方法。下面是实现三个主要功能的示例代码: 1)显示FTP服务器上的文件: void ftpList_actionPerformed(ActionEv…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...