awk从放弃到入门(11):拾遗之”三元运算”与”打印奇偶行”

awk从放弃到入门(11):拾遗之”三元运算”与”打印奇偶行”

      • 三元运算
      • 打印奇偶行

本博文转载自
这篇文章中的知识点是建立在前文的基础上的,如果你还没有掌握前文中的知识,请先参考之前的文章。

这篇文章其实是对之前知识点的拾遗,有些遗漏的常用知识点会在这篇文章中介绍。

三元运算


还记的我们在学习awk的 “if…else” 结构时,举的例子吗?我们来回顾一下。

在centos6中,我们可以判断用户的UID是否小于500,如果用户的UID大于500,则用户为普通用户,如果用户的UID小于500,则用户为系统用户。

所以,我们可以通过awk的 “if…else结构”,判断用户的UID范围,从而判断出用户属于哪种用户类型,示例如下

在这里插入图片描述
正如上图所示,我们使用”if…else”结构,对usertype变量进行了赋值,如果用户的UID小于500,则对usertype变量赋值为”系统用户”,否则则赋值usertype变量为”普通用户”,最后打印出用户名所在的列与usertype变量的值。

其实,我们可以使用三元运算,替换上例中的”if…else”结构语句,示例如下
在这里插入图片描述
正如上图所示,红线标注部分则使用了三元运算的语法,代替了之前”if…else”的语法,而三元运算的语法如下:

条件 ? 结果1 : 结果2

上述语法表示,如果条件成立,则返回结果1,如果条件不成立,则返回结果2。

而上例中,”$3<500″就是上述语法中的”条件”,”系统用户”就是上述语法中”?”后面的”结果1″,”普通用户”就是上述语法中”:”后面的”结果2″ ,同时,在上例中我们使用usertype变量接收了三元运算后的返回值,所以,当条件成立时,usertype变量被赋值为”系统用户”,当条件不成立时,usertype变量被赋值为”普通用户”。

是不是很方便?其实,三元运算还有另外一种使用方式,示例如下
在这里插入图片描述
我们通过上述命令,统计出了,系统用户有42个,普通用户有7个,上图中红线标注的用法可以理解为三元运算的另一种语法。如下

表达式1 ? 表达式2 : 表达式3

上述语法表示,如果表达式1为真,则执行表达式2,如果表达式1为假,则执行表达式3

而上例中,”$3<500″即为表达式1,”a++”即为表达式2,”b++”即为表达式3

也就是说,当每遇到一个UID小于500的用户,我就对变量a加1,否则我就对变量b加1,从而算出了系统用户与普通用户的数量,最后再END模式中输出了变量a与变量b的值。

是不是很容易理解?你一定已经明白了。

打印奇偶行


如果我们想要使用awk打印文本中的奇数行或者偶数行,则是非常简单的。

我们先来看看怎样使用awk打印奇数行或偶数行,然后再结合示例解释原理,所以看不懂没关系,后面会有解释。

在这里插入图片描述
正如上图所示,test12文件中有11行文本,我们可以使用非常简洁的awk命令,打印出了奇数行或者偶数行。

但是如果我们想要彻底搞明白原理,则需要搞明白如下两个知识点(后面会有更详细的解释)

1、在awk中,如果省略了模式对应的动作,当前行满足模式时,默认动作为打印整行,即{print $0}。

2、在awk中,0或者空字符串表示”假”,非0值或者非空字符串表示”真”

上述两个知识点是什么意思呢?我们慢慢聊。

在之前介绍awk模式的文章中提及过,模式可以理解为条件,如果当前行能与模式匹配,则会执行对应的动作。示例如下
在这里插入图片描述
上图中的两个命令均使用到了模式

第一个命令表示如果当前行中包含字符”1″,则执行对应的动作,而对应的动作就是打印整行。

第二个命令表示如果test12文本中文本行的第二列的值如果大于10,则执行对应的动作,而对应的动作就是打印整行。

那么,如果我们将上例中awk命令中的动作都省略,会出现什么情况呢?我们来试试。

在这里插入图片描述
我们发现,当使用了模式时,如果省略了对应的动作,会默认的输出整行。

也就是说,当使用了模式时,如果省略了模式对应的动作,默认动作为”{print $0}”

当然,”空模式”与”BEGIN/END模式”除外。

这就是第1个知识点的含义,我想你应该明白了,那么我们来聊聊第2个知识点。

在awk中,0或者空字符串表示”假”,非0值或者非空字符串表示”真”,什么意思呢?我们还是可以从模式说起,”模式”可以理解为”条件”,当条件成立,则为真,当条件不成立,则为假,所以,当模式为真时,则会执行对应的动作,当模式为假时,则不会执行对应的动作。

那么,我们能不能直接把模式替换为”真”或者”假”呢?我们来试试。

在这里插入图片描述
上例中,命令1使用了”空模式”,也就是说,每一行都满足模式,每一行经过”空模式”匹配以后结果都是”真”,所以每一行都会执行对应的动作。

命令2中,原来”模式的位置”被替换为了数字”1″,我们可以把数字”1″理解成一种模式匹配后的结果,而1是非零值,刚才说过,在awk中非零值表示真,所以,”1″表示”真”, 换句话说就是模式的匹配结果为真,模式成立则会执行对应的动作,而命令2中,对应的动作为打印整行。

命令3 与 命令2 同理,在命令3中, 数字”2″为非零值,表示真,可以理解为:模式的匹配结果为真,则会执行对应的动作,聪明如你一定想到了,数值”2″可以换做任何非0值或者非空字符串。

命令4中,数字”2″为非零值,表示模式为真,而之前说过,当使用模式时,可以省略动作,当使用模式并省略动作时,默认动作为打印整行,所以,命令4表示打印所有行,因为每一行的模式都为真。

命令5与命令6同理,在awk中,数字”0″与空字符串表示假,当模式为假时,不会执行对应的动作,而当存在模式并省略动作时,默认动作为打印整行,但是由于模式为假,所以对应的动作并未执行。

其实,我们还能对真与假进行取反,非真即为假,非假即为真,示例如下。

在这里插入图片描述
正如上图所示,我们使用”!”对真假进行取反。

如果你已经看懂了上面的例子,那么,我们再来延伸一下。

你猜猜,如下示例会输出什么?
在这里插入图片描述
没错,聪明如你一定想到了,上例中,其实是使用了awk的变量,将变量 i 赋值为1,当 i=1 以后,i为非零值,表示为真,我们可以认为这是一种模式匹配后的结果,当模式为真时,同时省略了对应动作时,默认动作为打印整行,所以上例会输出test3中的所有行。
在这里插入图片描述
理解完上述示例以后,我们再回过头来,看看之前打印奇数行的示例,你可能就会明白了。
在这里插入图片描述
当awk开始处理第一行时,变量 i 被初始化,变量 i 在被初始化时,值为”空”,而awk中,数字0或者”空字符串”表示假,所以可以认为模式为假,但是 i 直接取反了,对假取反后的值为真,将取反后的值又赋值给了变量i,此刻,变量i的值为真,所以当awk处理第一行文本时,变量i的值被赋值为真,模式成立则需要执行对应的动作,而上例中又省略了动作,所以默认动作为”{print $0}”,所以,第一行被整行打印了。

当第一行文本处理完毕后,awk开始处理第二行文本,此时,i 为真,但是取反后,i 为假,所以第二行没有被输出,依次类推,最终只打印了奇数行。

为了能够更加直观的看到上述过程,我们将i的值打印出来,通过如下动作,能够打印出处理每一行时,i 对应的值。
在这里插入图片描述
当然,聪明如你,我就不用再解释打印偶数行的原理了,我想你应该已经能够举一反三了。

好了,这篇文章就写到这里,希望能够对你有所帮助 客官常来呦~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语翻译小软件 ← Python实现

【程序描述】 利用Python实现一个英语翻译小软件。 ★ 当输入一个英文单词后&#xff0c;输出对应的中文意思。 ★ 当输入 q 时&#xff0c;退出程序。 ★ 当输入一个不存在的词条时&#xff0c;捕获异常&#xff0c;提示“No finding!”。【程序代码】 dict{&quo…

IOS/安卓+charles实现抓包(主要解决证书网站无法打开问题)

安装 官网下载 https://www.charlesproxy.com/latest-release/download.do 安装charles文档 流程 上述链接解决下图问题 使用介绍 Charles介绍 上述链接看一至三即可&#xff0c;了解首页各个按钮的作用 charles全面使用教程及常见功能详解&#xff08;较详细&#xff09…

Vim编辑器使用

替换全部 :%s/search_string/replace_string/g 撤销 u 撤销 ctrl r 取消撤销 换行 下移动一行 -上移动一行 删除 插入模式删除字符 Ctrl U

netty源码:(1)NioEventLoopGroup

EventLoopGroup bossGroup new NioEventLoopGroup(); 不加参数创建NioEventLoopGroup的话&#xff0c;会使用cpu核数*2作为bossGroup的线程数。

二 使用GPIO的复用功能 利用USART 实现printf()

参考这篇&#xff1a; STM32串口通信详解 1. 关于USART USART ( universal synchronous / asynchronous receiver /transmitter) 是一种串行通讯协议 , 允许设备通过串行端口进行数据传输&#xff0c; USART 能够以同步或者异步的方式进行工作&#xff0c;在实际的运用中&…

容器技术发展史,编排与容器的技术演进之路——2

目录&#xff1a; 容器技术发展史 Jail时代 1979 年 贝尔实验室发明 chroot2000 年 FreeBSD 4.0 发行 FreeBSD Jail2001 年 Linux VServer 发行2004 年 Solaris Containers 发行云时代 2006 年 google 推出 Process Containers2008 年 LXC 推出2011 年 CloudFoundry 推出 Ward…

【Linux】I/O多路转接技术

I/O多路转接技术 一、I/O多路转接之select1、select函数2、fd_set的相关内容3、如何在代码中高效的使用select函数4、select服务器5、select的优缺点6、select的适用场景 二、I/O多路转接之poll1、poll函数2、struct pollfd结构2、poll服务器3、poll的优缺点 三、I/O多路转接之…

自身免疫疾病抗原应用方向——博迈伦生物

自身免疫疾病是指机体免疫系统对自身组织产生异常免疫反应的疾病&#xff0c;包括类风湿性关节炎、系统性红斑狼疮、多发性硬化症等。目前&#xff0c;针对自身免疫疾病的治疗方案主要包括药物治疗和免疫调节治疗。而自身免疫疾病抗原应用则是一种新的治疗方向&#xff0c;其通…

Mac IDEA解决Maven项目命令行报错:command not found: mvn

1. 使用idea自带的maven命令 open -e ~/.zshrc 2. 在其最下面增加 # maven export MAVEN_HOME"/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3" export PATH$MAVEN_HOME/bin:$PATH # maven end 3. 连接使之生效 source ~/.zshrc4. 修改mvn…

Promise介绍

前言 Promise是一种用于处理异步操作的JavaScript对象&#xff0c;它可以将生产代码和消费代码连接起来&#xff0c;让异步方法像同步方法一样返回值。 异步操作是指在执行过程中可能会遇到延迟或等待的操作&#xff0c;例如网络请求、定时器、文件读取等。传统的JavaScript代码…

【从删库到跑路 | MySQL总结篇】索引的详细使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、索引…

WPF实战项目十八(客户端):添加新增、查询、编辑功能

1、ToDoView.xmal添加引用&#xff0c;添加微软的行为类 xmlns:i"http://schemas.microsoft.com/xaml/behaviors" 2、给项目添加行为 <i:Interaction.Triggers><i:EventTrigger EventName"MouseLeftButtonUp"><i:InvokeCommandAction Com…

单车模型及其线性化

文章目录 1 单车模型2 线性化3 实现效果4 参考资料 1 单车模型 这里讨论的是以后轴为中心的单车运动学模型&#xff0c;由下式表达&#xff1a; S ˙ [ x ˙ y ˙ ψ ˙ ] [ v c o s ( ψ ) v s i n ( ψ ) v t a n ( ψ ) L ] \dot S \begin{bmatrix} \dot x\\ \dot y\\ \d…

【C++】异常抛出变量的生命周期

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。搜…

代码随想录算法训练营第三十七天 _ 贪心算法_738.单调自增的数字、968.监督二叉树

学习目标&#xff1a; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 738.单调自增的数字 听不懂的时候就到该动手了。必须要从后向前操作&#xff0c;才能把压力逐级传给最前面的这一位。入如&#xff1a;322 class Solution {// java中的String不能修改&#xf…

Web3 开发者集结赢积分顺利闭幕!全程回顾一起来看

由 TinTinLand 联合 Dataverse 、Web3Go 、Subquery 、Cregis 、Litentry、Aspecta、SpaceID、ANOME、VARA&Gear、Moonbeam、Mantle、Obelisk 等 10 余家 Web3 项目共同举办的 Web3 开发者赢积分活动已于 11 月 26 日顺利落下帷幕&#xff0c;三周精彩纷呈的活动吸引了一众…

uniapp微信小程序地图实现绘制polygon(保姆级教程 全网最全!!!)

用户需求&#xff1a;需要在填写表单信息时&#xff0c;在地图上标绘自己房屋的位置信息。 这个问题处理了很久&#xff0c;在网上也没有找到全面的相关案例&#xff0c;所以我将我的思路分享给大家&#xff0c;希望可以解决大家遇到的问题。如果大家有更好的思路&#xff0c;…

中职组网络安全-PYsystem003.img(环境+解析)

​ web安全渗透 1.通过URL访问http://靶机IP/1&#xff0c;对该页面进行渗透测试&#xff0c;将完成后返回的结果内容作为flag值提交&#xff1b; 访问该网页后发现F12被禁用&#xff0c;使用ctrlshifti查看 ctrlshifti 等效于 F12 flag{fc35fdc70d5fc69d269883a822c7a53e} …

⭐ Unity + ARKIT ARFace脸部追踪

相比之前的图像物体检测&#xff0c;这脸部检测实现起来会更加的简单。 &#xff08;1&#xff09;首先我们先在场景中的物体上添加一个AR Face Mananger组件&#xff1a; &#xff08;2&#xff09;以上組件的 Face Prefab所代表的就是脸部的模型也就是覆盖在脸部上面的投影模…

通过PS导出样条线到3DMax挤出模型

1、PS制作样条线 PS用钢笔做出路径&#xff0c;导出 把.ai文件拖入3dmax中 2、挤出模型 调整模型在中心点位置&#xff0c;导出