shell生信技巧

AWK是门大学问(下)

2019-05-04  本文已影响109人  刘小泽

刘小泽写于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 '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

条件判断

一般使用:

第一种简单的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循环
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

Welcome to our bioinfoplanet!
上一篇下一篇

猜你喜欢

热点阅读