原文:http://doc.lazyhack.net/awk.htm

改变 awk 切割字段的方式 

echo "1 2*3%4" |awk '{print $1,$2}'

输出结果:1 2*3%4

$1=1 $2=2*3%4

echo "1 2*3%4" |awk -F"[ *%]" '{print $1,$2}'

$1=1 $2=2

字段分隔字符 FS (field seperator) awk的内建变量,其默认值是空白及tab.

awk每次切割字段时都会先参考FS 的内容故令-F"[ *%]"FS= "[ *%]",如果有连续多个分隔符可以[ *%]+

处理多行的数据

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 'BEGIN{RS="";FS="\n"} {print $1,$2,$3,$4}' week.rpt

输出结果:

张长弓 GNUPLOT 入门  

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