AWK使用
来源:百度文库 编辑:神马文学网 时间:2024/04/29 03:45:40
1 awk的调用可以定义变量,提供程序并且指定输入文件。
2 Awk [ -F fs ][ -v var=value …] ‘program’ [ --- ]\
[ var=value …] [ file(s) ]
Awk [ -F fs ] [ -vvar=value …] –f programfile [ --- ]\
[ var=value …] [ file(s) ]
A. 短程序直接在命令行上提供,长的程序以-f项指定。
B. --是特殊选项,指出awk本身已没有进一步的命令选项,任何接下来的选项都被你的程序使用。
C. -F 用来重新定义默认字段的分隔字符。分隔字符也可以使用内建变量FS指定。
awk –F ‘\t’‘{…}’ files FS=”[\f\v]” files
D. –v选项必须放在命令行上直接给定的任何程序之前,它们会在程序启动之前以及处理文件之前生效。
3 awk程序模型。
A. awk把输入流看作一连串的记录的集合,一行一条记录,每条记录再分为字段。
B.一个awk程序是一对以模式与大括号框起来的操作组合而成的。模式与操作可省略其中一个,如模式省略,则操作将被应用到每条输入记录。如果操作省略,则默认操作是打印匹配记录到标准输出上。
Pattern { action }
Pattern
{ action }
C. BEGIN与END ,BEGIN模式对应的操作只在-v选项完成后执行一次,通常BEGIN放到各种操作之前,END模式对应的操作在所有数据已被处理完成后执行,只执行一次,END通常放到最后。
4 程序元素
(1)两个连续的字符串会自动连接到一起。
(2)将数字转换为字符串,通过数字连接空字符串便可:n=123, s = “” n
(3)awk 功能强大的地方来自于它对正则表达式的支持。~ 匹配,!~ 不匹配。
“ABC” ~ “^[A-Z]+$” 结果为真。
(4)正则表达式常量可以用引号或斜杠来定界。注意转义:”\\\\Tex” 与/\Tex/都匹配包含\Tex的字字符串表达式。
(5)字符串转换成数字。加个零到字符串就可,s = “
“+123ABC”转成123,“ABC
(6)
5 内建变量
FILENAME当前的输入文件名
FNR当前的输入文件记录数。
FS字段分隔字符
NF当前记录的字段数
NR在工作中的记录数
OFS输出字段分隔字符
ORS输出记录分隔字符
RS输入记录分隔字符(仅用gawk,mawk)
6 字段
字段可以以特殊名称$0, $1, $2, … $NF供awk程序使用。$0引用当前的记录。记录分隔符不是记录的一部分。
7 awk里的单行程序。
(1) awk '{ C += length($0) + 1 ;W+= NF} {print NR, W, C }' 统计记录数输入的行数与总工的字节数。
(2) awk '{print $2, log($2) }'test2.txt 打印第2栏的值与其对数值。
(3) awk -v COLUMN=2 ' { sum +=$COLUMN } {print sum} ' test2.txt报告第2栏的值,注意栏就是列的意思。
(4) awk '/main/ { print FILENAME":" FNR ":" $0}' * 用AWK查找字符。然后打印出文件名所在和行与当前记录,也就是当前行内容。
(5) awk 'BEGIN { FS ="#"; OFS = "&" } { $2 = $2 ;print }' test3.txt >test4.txt
开始时指定#为记录中的字段分隔符,指定&为输出记录的字段分隔符。
8 语句
(1)连续执行。
多条语句写在一行上用分号隔开,或是一个语句一行。
(2)条件执行。
if(expressino)
Statement
else
Sssss
(3)重复执行。
A,while(express)
statement
B, do
statemetnt
while(expresss)
C, for(exp1;exp2; exp3)
statement
D, for(key in arrary)
statement
用来反复处理数组里的元素。
可以使用break,continue.
9 数组成员。
引用元素时如果元素不存在则会建一个元素。测试是应这样写if( “sally” in telArry)而非if( telArry[“sally”]!= “”);
10 用户控制输入
getline
11 执行外部程序
有三种方式
(1) getline语句通过管道外部程序通信。使用完管道后要用close()关闭。
(2) 输出重定向与外部程序通讯。使用完文件后要用close()关闭。
(3) system(command)。这个在system返回前会自动关闭所用的文件或管道。
12 用户定义函数。
(1)函数可以定义在程序顶层的任何位置:成对的模式/操作之前,之间,之后。惯例是放在后面。
(2)调用时函数名与括号之间不能有空格。
(3)标量为传值,数组为传引用,函数里可以更改数组中的值。
(4)函数返回值不是零就是空字符串。
(5)所有用在函数体内而在参数中没有出现的变量都认为是全局的。调用时传入的参数可以比定义的少,多余的参数视为局部变量。
13 字符串函数
(1) 子字符串提取
substr(string,start, len ) 返回一个由string的start字符开始,共len个字符长度的子字符串副本。字符位置从1开始编号, 参数超出范围得到一个空串。
(2) 字符串长度
length( string )
(3) 字母大小写转换
tolower(string),toupper( string )
tolower(“aBcDeF
(4) 字符串查找。
index( string,find ), 在string里查找find, 然后返回string里find字符串的起始位置,如果找不到就返回0,注意字符位置从1开始。
index(tolower(string), tolower(find))可以在查找时忽略大小写。
index只会找出第一个出现的字符串,要找最后一个的话没有标准的函数,下面这段程序可以完成这个功能。
functionrindex( string, find, k, ns, nf )
{
ns= length(string)
nf= length(find)
for(k = ns + 1-nf; k>=1; k--)
if(substr(string, k, nf) == find)
return k
return 0
}
(5) 字符串匹配
match(string,regexp)将string与正则表达式regexp匹配,如果匹配就返回匹配string的索引,不匹配就返回0.
(6)字符串替换
sub( regexp, replacement, target)
gsub(regexp, replacement, target)
(7)字符串分割。
Aawk 对当前记录$0自动进行了分割,$1, $2,$3 $NF.
B 可以用函数来做上面的分割。split( string, array,regexp ) regexp将string切割为片段,并存在array里,如果将第三个参数省略则用FS当成分隔符。数组从1开始。
A split( $0,parts, “:”)以冒号分隔。
B split(string,chars, “”)分隔符没有空格,就是把string分隔成单字节存放在chars数组中。
C split(“”,array ) 删除array里的所有元素。
(8)字符串重建
awk没有提供标准的重建函数,但可以通过下面的程序实现。
function join(array, n, fs, k, s )
{
#重新组合arrary元素为一字符串
#以fs为分隔
if( n >= 1 )
{
s = array[1]
for( k = 2; k<=n; k++)
s= s fs array[k]
}
return (s)
}
14 数值函数