`
xiangzi21
  • 浏览: 30103 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

sed与awk菜鸟的笔记--第八章 条件,循环和数组

阅读更多

第八章 条件,循环和数组

 

awk中的条件与循环结构是借鉴于c语言的.

 

条件语句

if (expression)

   action1

[else

   action2]

 

 

if (x) print x #测试x是否是非0值

if(x==y) print x #测试x是否等于y

if(x~/[yY]|es?/) print x #判断x是否与一个模式匹配

if(x~/^[yY]$|^[yY]es$/) print x #判断x是否是单独的y,Y,yes或Yes

 

 

#如果操作是多条语句,要用大括号括起来,awk对大括号和语句位置没有特殊要求(和sed不同),用分号可代替回车,与java也有点像.

#以下三种情况都可以,不过第一种可增加可读性

if(expression){

   statement1

   statement2

}

 

 

if(expression) action1

[else action2]

 

 

if(expression) action1;[else action2]

 

 

条件操作符

expr?action1:action2

?:操作符可以嵌套使用,这样会导致程序不易读.为了清晰,可以将条件括起来,如下:如果ave大于60则通过

grade = (ave>=60)?"Pass":"Fail"

 

 

循环

while循环

while(expression)

   action

 

 

do循环

do

   action

while(expression)

 

 

for循环

for(set_counter;test_counter;increment_counter)

   action

 

for (i=1;i<=NF;i++) print $i #用于打印出每一个输入行的每个字段

for (i=NF;i>=1;i--) print $i #从最后一个字段到第一个字段反向打印

 

 

求阶乘

fact=number

for(x=number-1;x>1;x--)

   fact*=x

fact=number;for(--number;number>1;number--) fact*=number;print fact

 

 

影响控制的其他语句

continue:结束当前循环,继续下一次循环

break:退出循环,继续下面的命令

next:能导致读入下一行,并返回到脚本的顶部

exit:退出循环,并将控制移到END规则

 

 

数组

array[subscript] = value

 

#数组不需要指明大小,只需要指明标识符,下面是为名为hello的数组的第[1]个元素赋值"world"

hello[1]="world"

#打印hello的数组的第[1]个元素

print hello[1]

 

 

关联数组

可以使用一个字符串作为数组的下标

arr["TEST"]

arr[$1]=$2

 

访问关联数组的所有元素,variable为一个随意变量名,array为数组名,但这个访问数组是随机的

for(variable in array[])

do something with array[variable]

 

#下面例子用于打印下标名和内容

for(item  in acro)

   print item,acro[item]

 

 

测试数组中的成员资格

in也是一个操作符,用于测试下标是否是数组成员

item in array #如果array[item]存在则返回1,否则返回0

 

 

用split()创建数组

内置函数split()能够将任何字符串分解到数组的元素中.

其实split()的作用就是可以更细化输入项,可以把各个输入域再通过分隔符分隔成更小块

 

n = split(string,array,separator)

string:要被分解的输入字符串

array:指定的数组.数组的下标从1开始到n,n即为数组中元素的个数.

separator:分解元素的分隔符.如果没指定则用默认的FS.它可以是个正则表达式,不仅仅只是一个单个字符.

 

#以下为对文件name_list的处理,文件名字以空格分隔,名字与号码之间以tab键分隔

$ cat name_list 

Tim Duncan      21

Jason Kidd      5

Kevin Garnett   21

 

#输入域分隔符是tab键,split()函数分隔符是空格,z为数组包含元素的个数

$ cat name_list | awk 'BEGIN{FS="\t"}{z=split($1,fullname," ");print z,fullname[1],fullname[2]}'

2 Tim Duncan

2 Jason Kidd

2 Kevin Garnett

 

#输入域分隔符是tab键,split()函数分隔符没有指定,则默认为FS,也为tab键

$ cat name_list | awk 'BEGIN{FS="\t"}{z=split($1,fullname);print z,fullname[1],fullname[2]}'    

1 Tim Duncan 

1 Jason Kidd 

1 Kevin Garnett 

 

#输入域分隔符是逗号,文件中没有逗号,所以每行只有一个域.split()函数分隔符为tab键,所以数组的第二个元素是号码.

$ cat name_list | awk 'BEGIN{FS=","}{z=split($1,fullname,"\t");print fullname[2]}'  

21

5

21

 

 

删除数组元素

将数组中下标为subscript的元素删除

delete array[subscript]

 

 

多维数组

array[m,n] #m行n列

awk不支持多为数组,但可以用语法来模拟引用多维数组.

file_array[NR,i] = $1

file_array[2,4] #表示第二行记录的第四个字段值

 

 

作为系统变量的数组

ARGV:命令行参数的数组,不包括脚本本身和任何调用awk指定的选项.元素个数可以从ARGC获得.第一个元素下标为0,最后一个下标是ARGC-1.

$ echo a | awk '{for (x in ARGV) print x,":",ARGV[x]} END{print ARGC}' m=1   #打印出命令行参数所有值ARGV,和个数ARGC

 

ENVIRON:环境变量数组.每个元素是当前环境变量的值,其下标是环境变量的名字.

$ echo a | awk '{for (x in ENVIRON) print x,":",ENVIRON[x]}' #打印当前系统环境变量值

 

修改ENVIRON数组中的元素不会修改环境变量.下例执行后HOSTNAME在shell环境中的值不会改变.

ENVIRON[HOSTNAME]="SPURS"

 

0
0
分享到:
评论

相关推荐

    sed and awk 101 hacks.pdf

    - **引用数组元素、使用循环遍历awk数组、删除数组元素、多维数组、SUBSEP下标分隔符、用asort为数组排序、用asorti为索引排序**:Awk的关联数组是处理文本数据的强大工具,它允许使用任意字符串作为数组的索引。...

    Vim-101-hacks、Sed-and-Awk-101-Hacks、Linux-101-hacks 英文版(高清)PDF

    "Sed-and-Awk-101-Hacks"可能涵盖awk的基础知识,如字段分隔符、模式匹配、条件判断、循环和函数。通过awk,你可以方便地处理CSV文件,进行数据分析,甚至实现简单的脚本任务。 4. Linux-101-hacks:Linux操作系统...

    Sed与awk_中英文高清版

    《Sed与Awk》是IT领域中关于文本处理的经典之作,主要讲解了两种强大的命令行工具:Sed(流编辑器)和Awk(数据处理语言)。这两款工具在Linux和Unix系统中广泛使用,尤其适用于数据提取、转换、报告生成等任务。 ...

    Sed与Awk (中文版)

    本书是sed与awk的第二版,由O'Reilly & Associates出版,并授权给机械工业出版社在中国发行。书中提及的ISBN7-111-11527-9为本书的标识。第一版由Dougherty和Robbins著,张旭东等人翻译,机械工业出版社出版于2003年...

    sed-awk-2nd-edition.chm

    The book begins with an overview and a tutorial that demonstrate a progression in functionality from grep to sed to awk. sed and awk share a similar command-line syntax, accepting user instructions in...

    sed & awk Pocket Reference-2nd-2002.chm

    English 2nd Edition 2002 chm format Summary of sed & awk

    SED与AWK 高清第三版

    《SED与AWK 高清第三版》是一本专注于Linux系统中强大文本处理工具sed和awk的教程。在Linux环境中,sed和awk是不可或缺的工具,它们能够高效地处理大量文本数据,进行搜索、替换、格式化等操作,极大地提高了运维...

    sed与awk(第二版)学习笔记

    sed与awk(第二版)学习笔记

    Sed与awk第二版(中文高清版)

    Sed与awk(第二版)这本书作为国外的经典教材,经过翻译后,为中文读者学习这些工具提供了极大的便利。它不仅系统地介绍了sed和awk的使用方法,还通过实例演示了如何编写有效的脚本来处理文本数据。对于那些希望提高...

    sed and awk 101 hacks

    第七章介绍了sed的多行命令和循环,这些高级技巧在处理跨多行的数据时非常有用,例如将下一行追加到模式空间(AppendNextLinetoPatternSpace)。 由于文档中存在OCR扫描误差,部分内容可能无法完全通顺。但是根据上...

    Sed与awk第二版(高清版).pdf

    根据提供的文件信息,我们可以从《Sed与awk第二版(高清版).pdf》这一资源中提炼出关于Sed和awk这两个强大的文本处理工具的相关知识点。虽然免责声明部分并未提供具体的技术内容,但我们可以通过书籍的标题、描述及...

    sed和awk的必备书籍

    包括: 1. sed与awk+第三版(中文高清晰),内容非常全面详细,看了觉得很不错,学习sed和awk的必备书籍。 2. Effective awk Programming, 4th Edition 3. Sed与awk第二版(高清版).pdf

    Sed与awk第二版(高清版)

    《Sed与Awk第二版》是一本深入探讨文本处理工具Sed和Awk的经典教程。这本书以高清的形式呈现,旨在帮助读者更好地理解和掌握这两种强大的命令行工具。Sed(Stream Editor)和Awk(Aho-Wedderburn-Kernighan)在Linux...

    Sed & Awk 2nd Edition

    第八章:讲解了在awk脚本中使用条件语句、循环和数组进行更复杂的数据操作。 第九章:探讨awk中的函数,包括内置函数和自定义函数的使用。 第十章:称为“百宝箱”,收集了一些实用的技巧和解决方案。 第十一章:...

Global site tag (gtag.js) - Google Analytics