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 = “123”n = 0 + s

        “+123ABC”转成123,“ABC124”转成0. “ABC” 转成0.“”转成0.

    (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(“aBcDeF123”), 返回”abcdef123”

(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 数值函数