AWK是门大学问(下)
刘小泽写于19.5.4
这次来看看AWK的各种运算操作符以及条件判断
示例文件
文件一
新建一个文件,有4列:员工ID、姓名、职位、薪水
cat >employee-sal.txt
101,John Doe,CEO,10000
102,Jason Smith,IT Manager,5000
103,Raj Reddy,Sysadmin,4500
104,Anand Ram,Developer,4500
105,Jane Miller,Sales Manager,3000
下面可以输出每个人的薪水,并且计算总共发放的薪水
awk -F, 'BEGIN {total=0} {print $2 " salary is: " $4; total+=$4} END {print "---\nTotal company salary = $"total}' employee-sal.txt
John Doe salary is: 10000
Jason Smith salary is: 5000
Raj Reddy salary is: 4500
Anand Ram salary is: 4500
Jane Miller salary is: 3000
---
Total company salary = $27000
文件二
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
一元运算操作符 Unary Operators
一元运算具有一个参数
操作符 | 描述 |
---|---|
+ | 返回数字本身 |
- | 相反数 |
++ | 累加 |
-- | 累减 |
比如要对某一列数字取相反数,直接在这一列的变量前面加-
即可
awk -F, '{print -$4}' employee-sal.txt
-10000
-5000
-4500
-4500
-3000
关于累加、累减的符号方向问题:
-
如果将
++
或者—
放在变量名之前,它会先把这一列数字全部加一或减一,再输出awk -F, '{print ++$4}' employee-sal.txt 10001 5001 4501 4501 3001
-
如果放在变量名之后,会先输出,再全部加一或减一
# 如果只这样输出的话,只会先输出计算之前的 awk -F ',' '{print $4++}' employee-sal.txt 10000 5000 4500 4500 3000 # 如果想输出计算后的,那么就需要再print一下 awk -F ',' '{$4++; print $4}' employee-sal.txt 10001 5001 4501 4501 3001
记做:
++或--
在前,先输出;在后,后输出
字符串操作符
主要使用空格,将两个字符串连接起来。中间空格数量不限,保证至少有一个,另外=
前后也是可以有空格的,这个不影响
例如:
awk 'BEGIN{str1="Bioinfo"; str2="planet"; str3=str1 str2; print str3}'
Bioinfoplanet
逻辑运算
处理> <
以外,判断等于用==
,不等于用!=
,表示且
用&&
,或
用||
使用逻辑值判断时,默认将符合条件的全行输出,如:
# 小于等于
awk -F "," '$5 <= 5' items.txt
102,Refrigerator,Appliance,850,2
105,Laser Printer,Office,475,5
# 等于
awk -F "," '$1 == 103' items.txt
103,MP3 Player,Audio,270,15
#满足条件指定输出其他项
awk -F "," '$1 == 103 {print $2}' items.txt
MP3 Player
# 不等于
awk -F "," '$3 != "Video"' items.txt
102,Refrigerator,Appliance,850,2
103,MP3 Player,Audio,270,15
104,Tennis Racket,Sports,190,20
105,Laser Printer,Office,475,5
# 多个逻辑判断 &&
awk -F "," '$4 < 900 && $5 <= 5' items.txt
102,Refrigerator,Appliance,850,2
105,Laser Printer,Office,475,5
# 多个判断后指定输出
awk -F "," '$4 < 900 && $5 <= 5 {print $2}' items.txt
Refrigerator
Laser Printer
# 使用||判断d
awk -F "," '$4 < 900 || $5 <= 5 {print $2}' items.txt
正则表达
当使用==
时,awk会从头到尾检查一遍,只有全部满足条件的,才可以输出
比如:
awk -F, '{print $2}' items.txt
HD Camcorder
Refrigerator
MP3 Player
Tennis Racket
Laser Printer
如果这里要挑出带有Laser的,使用awk -F "," '$2 == "Tennis"' items.txt
就没有结果,这时就要用到匹配操作符~
awk -F "," '$2 ~ "Laser"' items.txt
105,Laser Printer,Office,475,5
与之相反的是!~
,表示不包含
awk -F "," '$2 !~ "Laser"' items.txt
条件判断
一般使用:
- Simple If statement
- If-Else statement
第一种简单的if判断
if (条件判断) 操作
,并且可以支持多个操作,放在一个大括号中就好if (条件判断) {操作1;操作2}
比如输出items文件中最后一列数量小于等于5
的
awk -F, '{if ($5<=5) print "Only",$5,"qty of",$2, "is available"}' items.txt
Only 2 qty of Refrigerator is available
Only 5 qty of Laser Printer is available
再复杂一点,找到第四列的价位在500~1000之间,并且数量小于5的
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 (条件判断,可以有多个,其中每个判断都要写在小括号中)
操作1
else
操作2
循环
While循环
-
简单的while模式,例如
awk 'BEGIN \ { while (count++<50) string=string "x"; print string }'
-
do-while循环,使用
do action while(condition)
的结构,例如awk 'BEGIN {count=1;do print "At least once"; while(count!=1)}'
For循环
它的语法是这样的:
for(initialization;condition;increment/decrement)
actions
比如:
echo "1 2 3 4" | awk \
'{ for (i = 1; i <= NF; i++) total = total+$i }; \
END { print total }'
# 结果就是累加值 10
欢迎关注我们的公众号~_~
我们是两个农转生信的小硕,打造生信星球,想让它成为一个不拽术语、通俗易懂的生信知识平台。需要帮助或提出意见请后台留言或发送邮件到jieandze1314@gmail.com