awk的split函数

简介: awk 每次从数据文件中只读取一数据进行处理. awk是依照其内建变量 RS(Record Separator) 的定义将文件中的数据分隔成一行一行的Record. RS 的默认值是 "\n"(跳行符号), 故平常awk中一行数据就是一笔 Record. 但有些文件中一笔Record涵盖了多行数据, 这种情况下不能再以 "\n" 来分隔Records. 最常使用的方法是相邻的Reco

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手册 (摘自这儿.)




目录
相关文章
|
Shell Linux
Linux中常用的文本处理命令(echo、sort、uniq、tr、cut、split、eval)(上)
1、echo命令——输出 echo 命令主要用来显示字符串信息。
320 0
|
2天前
|
Linux
split 的详细用法
【4月更文挑战第13天】split 的详细用法
22 9
|
9月前
|
Python
Python:字符串基操_strip()/rstrip()/lstrip()_lower()/upper()_startswith()/endswith()_split()/rspilt()_join
Python:字符串基操_strip()/rstrip()/lstrip()_lower()/upper()_startswith()/endswith()_split()/rspilt()_join
78 0
|
测试技术 索引 Python
介绍kfold.split()的详细用法
KFold是交叉验证中的一种方法,其可以将数据集划分为K份,然后使用其中一份作为验证集,剩下的K-1份作为训练集。这个过程可以重复K次,以便每个子集都被用作验证集。KFold.split()是KFold类中的一个方法,用于将数据集分割为K个互不重叠的子集,每个子集包含相同数量的数据点。
698 0
|
Linux Shell
Linux中常用的文本处理命令(echo、sort、uniq、tr、cut、split、eval)(下)
1、echo命令——输出 echo 命令主要用来显示字符串信息。
216 0
|
Unix Linux Shell
字符操作命令:cut、printf、awk、sed、sort、wc
cut 命令 cut命令用来显示行中的指定部分