【译】 AWK教程指南 8处理多行数据
awk 每次从数据文件中只读取一行数据进行处理。awk是依照其内置变量 RS(Record Separator) 的定义将文件中的数据分隔成一行一行的Record。RS 的默认值是 "\n"(换行符),故平常awk中一行数据就是一条 Record。
但有些文件中一条Record涵盖了多行数据,这种情况下不能再以 "\n" 来分隔Records。最常使用的方法是相邻的Records之间改以 一个空白行 来隔开。
在awk程序中,令 RS = ""(空字符串)后,awk把会空白行当成来文件中Record的分隔符。显然awk对 RS = "" 另有解释方式,简略描述如下,
当 RS = "" 时:
1. 数个相邻的空白行,awk仅视成一个单一的Record Saparator。(awk不会于两个相邻的空白行之间读取一条空的Record)
2. awk会略过(skip)文件头或文件尾的空白行。故不会因为这样的空白行,造成awk多读入了两条空的记录。
请观察下例,首先建立一个数据文件 week.rpt 如下:
张长弓
GNUPLOT 入门 吴国强
Latex 简介
VAST-2 使用手册
mathematic 入门 李小华
awk Tutorial Guide
Regular Expression
该文件的开头有数行空白行,各条记录之间使用一个或数个空白行隔开。读者请细心观察,当 RS = "" 时,awk读取该数据文件的方式。
编辑一个awk程序文件 make_report 如下:
awk '
BEGIN {
FS = "\n"
RS = ""
split( "一. 二. 三. 四. 五. 六. 七. 八. 九.", C_Number, " " )
}
{
printf("\n%s 报告人 : %s \n",C_Number[NR],$)
for( i=; i <= NF; i++)
printf(" %d. %s\n", i-, $i)
}
' $*
执行
$ ./make_report week.rpt
屏幕产生结果如下:

说 明:
1. 本程序同时也改变字段分隔字符( FS= "\n" ),如此一条记录中的每一行都是一个字段。
例如: awk读入的第一条记录为
张长弓
GNUPLOT 入门
其中 $1 指的是"张长弓",$2 指的是"GNUPLOT 入门"
2. 上式中的C_Number[ ]是一个数组(array),用以记录中文数字。
例如:C_Number[1] = "一.", C_Number[2] = "二."
这过程使用awk字符串函数 split( ) 来把中文数字放进数组 C_Number[ ]中。
函数 split( )用法如下:
split( 原字符串, 数组名, 分隔字符(field separator) ):
awk将依所指定的分隔字符(field separator)分隔原字符串成一个个的字段(field),并以指定的 数组 记录各个被分隔的字段。
【译】 AWK教程指南 8处理多行数据的更多相关文章
- 【译】 AWK教程指南
前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...
- 【译】 AWK教程指南 1前言
前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...
- 【译】 AWK教程指南 附录D-AWK的内置变量
因内置变量的个数不多,此处按其相关性分类说明,并未按其字母顺序排列. ARGC ARGC表示命令行上除了选项 -F, -v, -f 及其所对应的参数之外的所有参数的个数.若将"awk程序&q ...
- 【译】 AWK教程指南 附录A-Patterns
awk 通过判断 Pattern 的值来决定是否执行其后所对应的Actions.这里列出几种常见的Pattern: A.1 BEGIN BEGIN 为 awk 的保留字,是一种特殊的 Pattern. ...
- 【译】 AWK教程指南 9读取命令行上的参数
大部分的应用程序都允许使用者在命令之后增加一些选择性的参数.执行awk时这些参数大部分用于指定数据文件文件名,有时希望在程序中能从命令行上得到一些其它用途的数据.本小节中将叙述如何在awk程序中取用这 ...
- 【译】 AWK教程指南 7AWK应用实例
本节将示范一个统计上班到达时间及迟到次数的程序. 这程序每日被执行时将读入两个数据文件: * 员工当日到班时间的数据文件 ( 如下列的 arr.dat ) * 存放员工当月迟到累计次数的文件 当程序执 ...
- 【译】 AWK教程指南 5AWK中的数组
awk程序中允许使用字符串当做数组的下标(index).利用这个特色十分有助于资料统计工作.(使用字符串当下标的数组称为Associative Array) 首先建立一个数据文件,并取名为 reg.d ...
- 【译】 AWK教程指南 4通过文本内容和对比选择指定的记录
Pattern { Action }为awk中最主要的语法.若某Pattern的值为真则执行它后面的 Action. awk中常使用"关系表达式" (Relational Expr ...
- 【译】 AWK教程指南 3计算并打印文件中指定的字段数据
awk 处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段:程序中可使用 $1, $2,... 直接取得各个字段的内容.这个特色让使用者易于用 awk 编写 reform ...
随机推荐
- SQL手工注入
site:xx.cn inurl:asp?id= //找文章 xx.cn/pth/onews.asp?id=243' //试注入 xx.cn/pth/onews.asp?id=243 order b ...
- 2026-Keroro侵略地球
描述 Keroro来侵略地球之前,曾跟Giroro伍长打赌:“我一个人灭掉整个地球给你看!”. 于是Keroro同学真的自己一个人来到地球开始他的侵略行动了.从K隆星出发之前,Keroro从Kurur ...
- ubuntu无线上网静态ip配置以及配置静态IP 之后无法正常上网的解决方案
一. 配置无线网络的静态IP 编辑/etc/network/interfaces文件如下: auto lo wlan0 iface lo inet loopback iface wlan0 inet ...
- N-Queens leetcode java
题目: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two que ...
- Python之函数篇
函数形参 函数取得的参数是你提供给函数的值,这样函数就可以利用这些值 做 一些事情.这些参数就像变量一样,只不过它们的值是在我们调用函数的时候定义的,而非在函数本身内赋值. 参数在函数定义的圆括号对内 ...
- node.js 异步式I/O 与事件驱动
Node.js 最大的特点就是异步式 I/O(或者非阻塞 I/O)与事件紧密结合的编程模式.这种模式与传统的同步式 I/O 线性的编程思路有很大的不同,因为控制流很大程度上要靠事件和回调函数来组织,一 ...
- Android开发之实用小知识点汇总-2
1.EditText 中将光标移到文字末尾: EditText mEdit = (EditText)this.findViewById(R.id.EditText01); mEdit .setText ...
- 学Android开发 这19个开发工具助你顺风顺水
学Android开发 这19个开发工具助你顺风顺水 要想快速开发一个Android应用,通常会用到很多工具,巧妙利用这些工具,能让我们的开发工作事半功倍,节省大量时间,下面大连Android开发培训小 ...
- Java多线程性能优化
大家使用多线程无非是为了提高性能,但如果多线程使用不当,不但性能提升不明显,而且会使得资源消耗更大.下面列举一下可能会造成多线程性能问题的点: 死锁 过多串行化 过多锁竞争 切换上下文 内存同步 下面 ...
- 深入理解Java虚拟机 - 虚拟机内存划分
在内存管理方面,Java相对于C和C++的区别在于Java具有内存动态分配以及垃圾收集技术,但平时我们很少去关注JVM的内存结构以及GC,在出现内存泄露或溢出方面的问题,排查工作将变得异常艰难. ...