Linux高级文本处理之gawk分支和循环(四)

一、if 结构

1.单条语句

语法:

if(conditional-expression )
action
  • if 是关键字
  • conditional-expression 是要检测的条件表达式
  • action 是要执行的语句

2.多条语句

如果要执行多条语句,需要把他们放在{ } 中,每个语句之间必须用分号或换行符分开,如下所示.

语法:

if (conditional-expression)
{
action1;
action2;
}

如果条件为真,{ } 中的语句会依次执行。当所有语句执行完后,awk 会继续执行后面的语句。

注意:与具体的花括号后面不能加分号。

实例1:打印数量小于等于 5 的所有商品

[[email protected] ~]# !cat
cat items.txt
101,HD Camcorder,Video,210,10
102,Refrigerator,Appliance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5
[[email protected] ~]# awk -F, ‘{ if($5<=5) print "Only",$5,"qty of",$2 "is available"}‘ items.txt 
Only 2 qty of Refrigeratoris available
Only 5 qty of Laser Printeris available

实例2:打印价钱在 500 至 100,并且总数不超过 5 的商品

[[email protected] ~]# awk -F, ‘{ if (($4 >= 500 && $4<= 1000) && ($5 <= 5)) print "Only",$5,"qty of",$2,"is available" }‘ items.txt    
Only 2 qty of Refrigerator is available

二、if else 结构

在 if else 结构中, 还可以指定判断条件为 false 时要执行的语句。 下面的语法中,如果条件 为 true,那么执行 action1,如果条件为 false,则执行 action2

语法:

if (conditional-expression)
action1
else
action2

此外, awk 还有个条件操作符( ? : ), 和 C 语言的三元操作符等价。

和 if-else 结构相同,如果 codintional-expresion 是 true,执行 action1,否则执行 action2。

三元操作符:

codintional-expression ? action1 : action2 ;

实例1:如果商品数量不大于 5,打印”Buy More”,否则打印商品数量

[[email protected] ~]# cat if.awk 
BEGIN {
FS=",";
} {
if( $5 <= 5)
print "Buy More: Order",$2,"immediately!"
else
print "Shell More: Give discount on",$2,"immediately!"
}
[[email protected] ~]# cat items.txt 
101,HD Camcorder,Video,210,10
102,Refrigerator,Appliance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5
[[email protected] ~]# awk -f if.awk items.txt 
Shell More: Give discount on HD Camcorder immediately!
Buy More: Order Refrigerator immediately!
Shell More: Give discount on MP3 Player immediately!
Shell More: Give discount on Tennis Racket immediately!
Buy More: Order Laser Printer immediately!

实例2:用三元操作符,把 items.txt 文件中的每两行都以逗号分隔合并起来

[[email protected] ~]# cat items.txt 
101,HD Camcorder,Video,210,10
102,Refrigerator,Appliance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5

[[email protected] ~]# awk ‘ORS=NR%2?",":"\n"‘ items.txt   
101,HD Camcorder,Video,210,10,102,Refrigerator,Appliance,850,2
103,MP3 Player,Audio,270,15,104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5,[[email protected] ~]#

相同于:

[[email protected] ~]# awk ‘{ if (NR %2 ==0) ORS = "\n";else ORS = ",";print}‘ items.txt                    
101,HD Camcorder,Video,210,10,102,Refrigerator,Appliance,850,2
103,MP3 Player,Audio,270,15,104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5,[[email protected] ~]#

二、while 循环

语法:

while (codition)
Actions
  • while 是 awk 的关键字
  • condition 是条件表达式
  • actions 是循环体,如果有多条语句,必须放在{ }中

while首先检查 condtion,如果是 true,执行 actions,执行完后,再次检查 condition,如果是 true, 再次执行 actions,直到 condition 为 false 时,退出循环。

实例1:

[[email protected] ~]# awk ‘BEGIN { while(count++<50) string=string "x"; print string}‘
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

实例2:算 items-sold.txt 文件中,每件商品出售的总数

[[email protected] ~]# cat items-sold.txt 
101 2 10 5 8 10 12
102 0 1 4 3 0 2
103 10 6 11 20 5 13
104 2 3 4 0 6 5
105 10 2 5 7 12 6
[[email protected] ~]# awk ‘
>{i=2;total=0;while(i<=NF) 
>{total=total+$i;i++;}
>print total}‘ items-sold.txt 
47
10
65
20
42

三、do-while 循环

While 循环是一种进入控制判断的循环结构,因为在进入循环体前执行判断。而 do-while 循 环是一种退出控制循环,在退出循环前执行判断。 do-while 循环至少会执行一次,如果条 件为 true,它将一直执行下去。

语法:

do
action
while(condition)

实例1:

[[email protected] ~]# awk ‘BEGIN{ do print "this is a test";while (count++ < 5);}‘ 
this is a test
this is a test
this is a test
this is a test
this is a test
this is a test

注意:首先执行一次,所以上述实例打印6次。

实例2:

[[email protected] ~]# cat dowhile.awk 
{
i=2;
total=0;
do {
total = total + $i;
i++;
}
while(i<=NF)
print "Item",$1,":",total,"quantities sold";
}
[[email protected] ~]# awk -f dowhile.awk items-sold.txt 
Item 101 : 47 quantities sold
Item 102 : 10 quantities sold
Item 103 : 65 quantities sold
Item 104 : 20 quantities sold
Item 105 : 42 quantities sold

四、for循环

语法:

for(initialization;condition;increment/decrement)

for 循环一开始就执行 initialization,然后检查 condition,如果 condition 为 true,执行 actions,然后执行 increment 或 decrement.如果 condition 为 true,就会一直重复执行 actions 和increment/decrement。

实例1:计算1到4的整数和。

[[email protected] ~]# echo "1 2 3 4"|awk ‘{for(i=1;i<=NF;i++) total+=$i;}END{print total}‘
10

实例2:把文件中的字段反序打印出来

[[email protected] ~]# awk ‘   
>BEGIN{ORS=""}
>{for(i=NF;i>0;i--) 
>print $i," ";
>print "\n"}‘ items-sold.txt 
12  10  8  5  10  2  101  
2  0  3  4  1  0  102  
13  5  20  11  6  10  103  
5  6  0  4  3  2  104  
6  12  7  5  2  10  105

注意:在 awk 里, print 和 printf 的区别是, print 输出当前记录(行 record), 并在最后自动加上 ORS ( 默认是\n ,但可以是任何字符串). 而 printf 是按给定格式输出内容, 你给它 ORS 参数, 它就输出 ORS, 没给就不输出.

五、break 语句

Break 语句用来跳出它所在的最内层的循环(while,do-while,或 for 循环)。请注意, break 语句 只有在循环中才能使用。

实例1:打印某个月销售量为 0 的任何商品

[[email protected] ~]# awk ‘
>{for(i=2;i<=NF;i++) 
>{if($i == 0) 
>{print $0;break;}}}‘ items-sold.txt 
102 0 1 4 3 0 2
104 2 3 4 0 6 5

实例2:

[[email protected] ~]# awk ‘BEGIN{while(1) {i++;if(i==10) break;print "young";}}‘
young
young
young
young
young
young
young
young
young

六、 continue 语句

Continue 语句跳过后面剩余的循环部分,立即进入下次循环。 请注意, continue 只能用在循
环当中。

实例1:打印 items-sold.txt 文件中所有商品的总销售量

[[email protected] ~]# awk ‘
>{total=0;for(i=1;i<=NF;i++) 
>{if(i == 1) continue;total+=$i};
>print total}‘ items-sold.txt  
47
10
65
20
42

实例2:

[[email protected] ~]# awk ‘BEGIN{for(i=1;i<=5;i++) 
>{if(i ==3 ) continue;
>print "this is:",i,"x";}}‘ 
this is: 1 x
this is: 2 x
this is: 4 x
this is: 5 x

六、exit 语句

exit 命令立即停止脚本的运行,并忽略脚本中其余的命令。 exit 命令接受一个数字参数最为 awk 的退出状态码,如果不提供参数,默认的状态码是 0.

实例1:

[[email protected] ~]# cat items-sold.txt 
101 2 10 5 8 10 12
102 0 1 4 3 0 2
103 10 6 11 20 5 13
104 2 3 4 0 6 5
105 10 2 5 7 12 6
[[email protected] ~]# cat so
{
i=2;total=0;
while(i++<=NF)
if($i==0) {           #某月份销量为0则退出脚本
print "Item",$1,"had a month with no item sold";
exit;
}
}
[[email protected] ~]# awk -f so items-sold.txt 
Item 102 had a month with no item sold

七、next语句

next提前结束本行处理,进入下一行处理。

实例1:


[[email protected] ~]# cat next.txt 
aa bb
cc dd
ee ff
gg hh
[[email protected] ~]# awk ‘{if(NR == 1) next;print $1,$2}‘ next.txt 
cc dd
ee ff
gg hh
时间: 2024-10-31 14:05:54

Linux高级文本处理之gawk分支和循环(四)的相关文章

Linux高级文本处理之gawk实战(七)

1.取出linux中eth0的IP地址 [[email protected] ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}' 192.168.1.8 说明: "+"为正则表达式模式匹配至少重复一次. 2.统计文件中所有行单词出现的次数 [[email protected] ~]# awk ' >{for(i=1;i<=NF;i++) >{count[$i]++}} >END{for(j in count)

Linux高级文本处理之gawk内置变量(一)

一.FS –输入字段分隔符 FS是awk内置变量,用来制定行分隔符,功能能-F一样,区别在于FS只能用在BEGIN语句块当中,命令格式如下: BEGIN{FS="SEPARATOR"} 实例1: [[email protected] ~]# awk 'BEGIN { FS=","; print "---------------------------\nName\tTitle\n------------------------"} {print 

Linux高级文本处理之sed(四)

模式空间是sed内部维护的一个缓存空间,它存放着读入的一行或者多行内容.但是模式空间的一个限制是无法保存模式空间中被处理的行,因此sed又引入了另外一个缓存空间--模式空间(Hold Space). 一.保持空间 保持空间用于保存模式空间的内容,模式空间的内容可以复制到保持空间,同样地保持空间的内容可以复制回模式空间.sed提供了几组命令用来完成复制的工作,其它命令无法匹配也不能修改模式空间的内容. 操作保持空间的命令如下所示: 这几组命令提供了保存.取回以及交换三个动作,交换命令比较容易理解,

Linux高级文本处理之sed(一)

sed:Stream Editor文本流编辑,sed是一个"非交互式的"面向字符流的编辑器.能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上.还可以对原文件改动,但是不会再屏幕上返回结果. 基本概念 一.sed命令的语法如下所示: sed [options] script filename sed命令的选项(option): -n :只打印模式匹配的行 -e :多脚本运行,多点编辑,例如 -e script1 -e scrip

Linux高级文本处理命令

cut 一.cut命令 功能:cut命令可以从一个文本文件/文本流中提取文本列 语法: cut -d '分割字符' -f fields ##用于有特定分割字符 cut -c 字符区间 ##用于排列整齐的信息 选项与参数: -d:后面接分隔字符.与 -f 一起使用: -f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思 -c:以字符(charaters)的单位取出固定字符区间 sed awk 原文地址:https://www.cnblogs.com/xiaowenshu/

Linux 高级文本处理命令

1.2.1 cut命令 cut命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields     ## 用于有特定分隔字符 [root@www ~]# cut -c 字符区间            ## 用于排列整齐的信息 选项与参数: -d:后面接分隔字符.与 -f 一起使用: -f:依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思: -c:以字符 (characters) 的单位取出固定字符区间

一个电影的时间掌握Awk(Linux)文本处理脚本语言

可以查看我用CmdMarkDown写的在线版,会比下面看起来舒服:在线分享版 Awk Awk.sed与grep,俗称Linux下的三剑客,它们之前有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和awk还可以用于文本编辑,而grep则不具备这个功用.sed是一种非交互式且面向字符流的编辑器(a "non-interactive" stream-oriented editor),而awk则是一门模式匹配的编程语言,因为它的主要功能是用于匹配文本并处理,同时

谢烟客---------Linux之文本处理三剑客之grep

Linux之文本处理三剑客介绍 awk 名称得自于它的创始人阿尔佛雷德·艾侯.彼得·温伯格和布莱恩·柯林汉姓氏的首个字母,它具备了一个完整的语言所应具有的几乎所有精美特性,AWK是一个解释器,三位创建者已将它正式定义为"样式扫描和处理语言".它允许您创建简短的程序,这些程序读取输入文件.为数据排序.处理数据.对输入执行计算以及生成报表,还有无数其他的功能.Linux使用的是Gnu版本的AWK,gawk grep 全称"Global search REgular express

Linux的文本处理工具浅谈-awk sed grep

Linux的文本处理工具浅谈 awk   老大 [功能说明] 用于文本处理的语言(取行,过滤),支持正则 NR代表行数,$n取某一列,$NF最后一列 NR==20,NR==30 从20行到30行 FS竖着切,列的分隔符 RS横着切,行的分隔符 [语法格式] awk [–F] [“[分隔符]”] [’{print$1,$NF}’] [目标文件] awk 'BEGIN{FS="[列分隔符]+";RS="[行分隔符]+";print "-GEGIN-"