awk处理多行记录

我们所有的例子中用到的输入文件其记录都是由单独一行组成的。在这一部分,我们将演示如何读入一个记录,而记录中的每个字段都由单独一行组成。

前面我们了解了处理姓名和地址的文件的例子。让我们假设相同的数据保存在块格式的文件中。不是将所有的信息放置在一行,而是将人名放在一行,在下一行放置公司名、依此类推。下面是一个记录样本:

John Robinson

Koren Inc.

978 Commonwealth Ave.

Boston

MA 01760

696-0987

这个记录有6个字段,记录之间用空行分隔。为了处理这种包括多行数据的记录,我们可以将字段分隔符定义为换行符,换行符用"\n" 来表示,并将记录分隔符设置为空字符串,它代表一个空行。

BEGIN { FS = "\n";
RS = "" }

我们可以使用下面的脚本来打印第一个和最后一个字段:

$ cat block.awk

# block.awk -打印第一个和最后一个字段

# $1 = name; $NF = phone number

BEGIN { FS = "\n";
RS = "" }

{ print $1 , $NF}

例子的运行结果如下:

$ awk -f block.awk phones.block

John Robinson 696-0987

Phyllis Chapman 879-0900

Jeffrey Willis 914-636-0000

Alice Gold (707) 724-0000

Bill Gold 1-707-724-0000

这两个字段输出在同一行是因为默认的输出字段分隔符(OFS)仍然是一个空格。如果希望将这些字段输出在不同的行上,可以将OFS的值改变为一个换行符来实现。这样,你可能希望用空格将记录分隔开,因此必须将输出记录分隔符ORS设置为两个换行符。

参考资料:http://www.linuxawk.com/communication/497.html

时间: 2024-10-13 11:56:35

awk处理多行记录的相关文章

计算数据库中各个表的数据量和每行记录所占用空间--添加架构信息-读后感及知识整理

参考文章: SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database) 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 监控SQLServer 数据库表每天的空间变化情况 仔细拜读上面三位的文章,不会的知识点又参考了MSDN,巩固了知识点如下: 知识点: 1.表的架构信息,涉及的系统对象 sys.schemas 和 INFORMATION_SCHEMA.TABLES,但后者不是官方推荐方式,

INSERT INTO插入行记录

--添加一条记录 INSERT INTO tableName(col1,col2,col3) VALUES (1,2,3) --添加多条记录 INSERT INTO tableName(col1,col2,col3) SELECT 3,4,5 UNION ALL SELECT 6,7,8 --从另外的一张表中读取多条数据添加到新表中 INSERT INTO tableName(col1,col2,col3) SELECT a,b,c FROM tableA --从其他的多张表中读取数据添加到新表

ADF_12c_遍历VO处理行记录

ADF中遍历VO行记录不止一种方法,但项目开发中仍有区别,如下给出两种方法. 1.通过VO直接取行: TargetRunVarForUpdatedImpl vo = (TargetRunVarForUpdatedImpl)getViewObject("TargetRunVarForUpdatedIterator"); int i = 0; Row row = null; vo.reset(); while (vo.hasNext()) { if (i == 0) row = vo.fi

INSERT INTO .. ON DUPLICATE KEY更新多行记录

转自:http://www.ludou.org/insert-into-on-duplicate-key-update-for-multiple-items.html 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE:如果不会导致唯一值列重复的问题,则插入新行.例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果: 1234 INSERT 

Oracle多行记录合并的几种方法

今天正好遇到需要做这个功能,顺手搜了一下网络,把几种方法都列出来,方便以后参考. 1 什么是合并多行字符串(连接字符串)呢,例如: SQL> desc test; Name Type Nullable Default Comments ------- ------------ -------- ------- -------- COUNTRY VARCHAR2(20) Y CITY VARCHAR2(20) Y SQL> select * from test; COUNTRY CITY ---

SQLLoader7(只导入数据文件的其中几行记录)

数据文件: D:\oracletest\test1.txt 1 SMITH CLERK 7902 1980-12-17 800 0 20 2 ALLEN SALESMAN 7698 1981-02-20 1600 300 30 3 WARD SALESMAN 7698 1981-02-22 1250 500 30 4 JONES MANAGER 7839 1981-04-02 2975 0 20 5 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30 6 B

awk除去重复行

awk去除重复行,思路是以每一行的$0为key,创建一个hash数组,后续碰到的行,如果数组里已经有了,就不再print了,否则将其print 测试文件: 用awk: 用sort+uniq好像出错了: 到底是为什么uniq出错了呢?不知道,但是awk真的很强大.两者的差异还在于,awk保持了文件中原本的每行的顺序,而sort必须排序,这样就变成按字母或某种其他规则的排序了. PS:uniq出错好像是因为\r\n的问题. PS:错了.有的教程上,uniq -u就跟uniq是一样的.我用cygwin

基于binlog来分析mysql的行记录修改情况(python脚本分析)

最近写完mysql flashback,突然发现还有有这种使用场景:有些情况下,可能会统计在某个时间段内,MySQL修改了多少数据量?发生了多少事务?主要是哪些表格发生变动?变动的数量是怎么样的? 但是却不需要行记录的修改内容,只需要了解 行数据的 变动情况.故也整理了下. 昨晚写的脚本,因为个人python能力有限,本来想这不发这文,后来想想,没准会有哪位园友给出优化建议. 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各

执行一次SQL查询,修改UPDATE多行记录

通常情况下,我们会使用以下SQL语句来更新字段值: UPDATE mytable SET myfield='value' WHERE other_field='other_value';UPDATE mytable SET myfield='value' WHERE other_field='other_value'; 但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源.教程指南.橱窗展示),这些分类目录的信息存储在数据库表c