awk讲义-1-快速入门

一、目标问题:

  • 1.统计各个省份中城市的数量(一维数组)
  • 2.统计城市中区县数量,要求输出格式:省份 城市 区县数量(二维数组)
  • 3.求两个文件的交集
  • 4.省市和市区两个文件进行join操作
  • 5.求两个文件的并集
  • 6.求两个文件的差集

二、入门案例

1.每位雇员的名字以及他们的报酬 (每小时工资乘以工作时长), 而雇员的工作时长必须大于零

awk '$3 > 0 { print $1, $2 * $3 }' emp.data

2.哪些员工在偷懒(工作时间为0)

awk '$3 == 0 { print $1 }' emp.data

三、awk程序结构

1.模式动作即pattern { action }

2.如果输入多个文件 或者没有输入文件?

没有输入文件的话会把awk程序应用在控制台的输入上。

也可以与shell的管道一起使用

3.变量与内置变量

自定义变量:

1.通过-v varname=value 变量名区分字符大小写。

优点:可以直接引用shell中的变量

2.在program中直接定义

3.数组与多维数组(hashmap):

Awk 的数组与大多数其他语言最大的不同点是, 数组元素的下标是字符串. 这个特性使得

awk 具有关联内存的能力, 也由于这个原因, awk 的数组称为 关联数组 (associative arrays).

多维数组 (Multidimensional Arrays). Awk 不直接支持多维数组, 但是它利用一维数组来

近似模拟多维数组

在 awk 内部, 下标其实是以 53

字符串的形式存储的, 字符串具有形式 1 SUBSEP 1, 1 SUBSEP 2 等等. 内建变量 SUBSEP 用

于分隔下标的各个构成成分, 它的默认值是 "\034"

测试一个多维下标是否是某个数组的成员,可以这样写
if ((i,j) in arr) ...
遍历一个这样的数组, 可以这样写:
for (k in arr) ...
单独地访问下标的某个成分,可以使用split(k, x, SUBSEP)

实战:

1.统计各个省份中城市的数量(一维数组)

2.统计城市中区县数量,要求输出格式:省份 城市 区县数量(二维数组)

内置变量:

FS:输入字段分隔符, 默认为空白字符

OFS:输出字段分隔符, 默认为空白字符

RS:输入记录分隔符(输入换行符), 指定输入时的换行符

ORS:输出记录分隔符(输出换行符),输出时用指定符号代替换行符

NF:number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量

NR:行号,当前处理的文本行的行号。

FNR:各文件分别计数的行号

FILENAME:当前文件名

ARGC:命令行参数的个数

ARGV:数组,保存的是命令行所给定的各参数
’pattern{ action }’并不被看做是参数,awk被看做为参数。

4.流程控制语句

If-Else语句

计算每小时工资多于 $6.00 的雇员的总报酬与平均报酬.

$2 > 6 { n = n + 1; pay = pay + $2 * $3 }
END { if (n > 0)
print n, "employees, total pay is", pay,
"average pay is", pay/n
else
print "no employees are paid more than $6/hour"
}

附录

参考资料:The AWK Programming Language(作者: Alfred V. AhoBrian W. Kernighan / Peter J. Weinberger

awk讲义-1-快速入门的更多相关文章

  1. [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门

    [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门 1. 什么是正则表达式? 1.1 正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简 ...

  2. Linux快速入门03-系统管理

    这部分将涉及常用的各类linux命令和一些系统高级管理特性,尤其是shell script的创建,这部分在系统自动化运维时会很有作用. Linux系列文章 快速入门系列--Linux--01基础概念 ...

  3. Java Web快速入门——全十讲

    Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲 ...

  4. 私有仓库GitLab快速入门篇

    私有仓库GitLab快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 安装文档请参考官网:https://about.gitlab.com/installation/#ce ...

  5. ELK快速入门(一)基本部署

    ELK快速入门一-基本部署 ELK简介 什么是ELK?通俗来讲,ELK是由Elasticsearch.Logstash.Kibana 三个开源软件组成的一个组合体,这三个软件当中,每个软件用于完成不同 ...

  6. Polar码快速入门

    Polar码快速入门 本科生在学习极化码时,并不是件简单的事情.网上极化码的资料很少,而且基本上都是较难的论文.这篇文章是用来帮你快速入门极化码. Poalr码背景 2015 年,国际电信联盟无线通信 ...

  7. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  8. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  9. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

随机推荐

  1. ApacheCN Linux 译文集 20211129 更新

    笨办法学 Linux 中文版 练习 0:起步 练习 1:文本编辑器,vim 练习 2:文本浏览器,少即是多 练习 3:Bash:Shell..profile..bashrc..bash_history ...

  2. 使用Hot Chocolate和.NET 6构建GraphQL应用(6) —— 实现Query排序功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 从前几篇文章可以看出,使用Hot Chocolate实现GraphQL接口是比较简单的,本篇文章我们继续查询 ...

  3. SP19149 INS14H - Virus Revisited

    可以发现,如果一个整体一起考虑是不能找到一个合适的状态来描述这个情形的. 因此可以考虑寻找整体的反面,也就是将每个维度分开考虑. 不难发现每个维度本质上是一样的,因此不需要考虑不同维度之间的区别. 那 ...

  4. linux下使用openssl生成 csr crt CA证书

    证书文件生成:一.服务器端1.生成服务器端    私钥(key文件);openssl genrsa -des3 -out server.key 1024运行时会提示输入密码,此密码用于加密key文件( ...

  5. spring filter详解

    一.Filter基本工作原理 1.Filter 程序是一个实现了特殊接口的 Java 类,与 Servlet 类似,也是由 Servlet 容器进行调用和执行的. 2.当在 web.xml 注册了一个 ...

  6. Java中File类的方法详解

    File类也是Java中一个比较重要的类,通过他我们可以实现对文件的一系列操作,其内置了很多方法,下面我将按方法的功能分块,逐一讲解: 快速导航 构造方法 常用方法 创建目录 判断 `is...` t ...

  7. Pandas之isna,fillna

    isna() 释义 筛选为NaN的布尔值,可接受单个标量或者数组 举例 筛选stu_name为NaN的所有行: df = pd.DataFrame({'stu_name': ['Tom', 'Tony ...

  8. Appium链接夜神模拟器

    参考官方技术文档: http://appium.io/slate/cn/master/ 确保已经安装jdk和adt adb需要配置系统环境变量: D:\adt-bundle-windows-x86_6 ...

  9. python使用泛型

    所谓的泛型, 就是将数据类型作为参数进行传递, 即在我们用的时候确定数据类型, 这是一种在面向对象语言中经常使用的特性 一般类使用 以SQLAlchemy举例 比如: 我们统一写个将数据保存到数据库的 ...

  10. Solution -「LOCAL」ZB 平衡树

    \(\mathcal{Description}\)   OurOJ.   维护一列二元组 \((a,b)\),给定初始 \(n\) 个元素,接下来 \(m\) 次操作: 在某个位置插入一个二元组: 翻 ...