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

Welcome to our bioinfoplanet!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,214评论 2 25
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,744评论 0 10
  • Linux指令中文说明传送入口 整理自Linux指令中文说明 文本和数据进行处理的编程语言awk 是一种编程语言,...
    释闲人阅读 2,123评论 1 6
  • awk:报告生成器,格式化文本输出 内容: awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 a...
    BossHuang阅读 1,457评论 0 9
  • 本章主要学习内容awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 awk条件判断 a...
    楠人帮阅读 1,269评论 0 8