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…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...