awk的split函数

本文介绍了如何在awk中使用split函数处理多行记录的问题。通过设置RS为空字符串,awk可以将多个空白行分隔的记录视为一个整体。在示例中,展示了如何读取一个包含空白行分隔记录的文件,并使用split函数将中文数字拆分到数组中,以进行进一步的处理。此外,还解释了split函数的用法,它可以根据指定的分隔字符将字符串拆分为数组中的字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

awk 每次从数据文件中只读取一数据进行处理.

awk是依照其内建变量 RS(Record Separator) 的定义将文件中的数据分隔成一行一行的Record. RS 的默认值是 "\n"(跳行符号), 故平常awk中一行数据就是一笔 Record. 但有些文件中一笔Record涵盖了多行数据, 这种情况下不能再以 "\n" 来分隔Records. 最常使用的方法是相邻的Records之间改以 一个空白行 来隔开. 在awk程序中, 令 RS = ""(空字符串)后, awk把会空白行当成来文件中Record的分隔符. 显然awk对 RS = "" 另有解释方式,简略描述如下, 当 RS = "" 时:数个并邻的空白行, awk仅视成一个单一的Record Saparator. (awk不会于两个紧并的空白行之间读取一笔空的Record)

awk会略过(skip)文件头或文件尾的空白行. 故不会因为这样的空白行,造成awk多读入了二笔空的数据.

请观察下例,首先建立一个数据文件 week.rpt如下:

张长弓
GNUPLOT 入门



吴国强
Latex 简介
VAST-2 使用手册
mathematic 入门

李小华
awk Tutorial Guide
Regular Expression


该文件的开头有数行空白行, 各笔Record之间使用一个或数个空白行隔开. 细心观察以下, 当 RS = "" 时, awk读取该数据文件之方式.

编辑一个awk程序文件 make_report.sh 如下:

#!/bin/bash

awk '
BEGIN {
FS="\n"
RS=""
split("一. 二. 三. 四. 五. 六. 七. 八. 九.",C_Nnumber," ")
}
{
printf ("\n%s 报告人: %s\n", C_Number[NR],$1)
for (i = 2; i <= NF; i++)printf(" %d. %s\n", i-1, $i)
}' $*

执行:

shell>./make_report.sh week.rpt 

结果如下:

 一. 报告人: 张长弓
 1. GNUPLOT 入门

 二. 报告人: 吴国强
 1. Latex 简介
 2. VAST-2 使用手册
 3. mathematic 入门

 三. 报告人: 李小华
 1. awk Tutorial Guide
 2. Regular Expression

[说明]

本程序同时也改变字段分隔字符( FS= "\n" ), 如此一笔数据中的每一行都是一个field. 例如: awk读入的第一笔 Record 为

张长弓
GNUPLOT 入门

其中 $1 指的是"张长弓", $2 指的是"GNUPLOT 入门"

上式中的C_Number[ ]是一个数组(array), 用以记录中文数字. 例如: C_Number[1] = "一.", C_Number[2] = "二." 这过程使用awk字符串函数 split( ) 来把中文数字放进数组 C_Number[ ]中.

函数 split( )用法如下:

split( 原字符串, 数组名称, 分隔字符(field separator) ) 

awk将依所指定的分隔字符(field separator)分隔原字符串成一个个的字段(field), 并以指定的 数组 记录各个被分隔的字段

再例如 :

ArgLst = "5P12p89"
split( ArgLst, Arr, /[Pp]/)

执行后 : Arr[1]=5,  Arr[2]=12,  Arr[3]=89


 

参考:

awk手册 (摘自这儿.)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值