打开高效文本编辑之门_Linux Awk之条件判断与循环
Linux awk之條件判斷與循環(huán)
聲明與簡(jiǎn)介
AWK?是一種處理文本文件的語(yǔ)言,是一個(gè)強(qiáng)大的文本分析工具。awk通常用來處理結(jié)構(gòu)化(固定格式)的文本文件, awk每接收文件的一行,然后執(zhí)行相應(yīng)的命令來處理文本。
本文是對(duì)awk的分支與循環(huán),主要結(jié)合數(shù)據(jù)以案例形式介紹怎樣使用分支判斷、循環(huán)控制。
數(shù)據(jù)說明
emp_3_only.txt,該數(shù)據(jù)來自全量的員工表的前3行。
條件判斷
對(duì)不同條件進(jìn)行邏輯的跳轉(zhuǎn)和轉(zhuǎn)換。常見關(guān)鍵字如IF、IF ELSE WHILE、DO WHILE等。
單IF語(yǔ)句
即只有一個(gè)IF的情況,此情況僅處理滿足IF條件的邏輯,其它情況不處理。
# 輸出工資在1300和1700之間的員工編號(hào)和姓名。 awk -F"," '{if($6>=1300 && $6<1700) print $1,$2,$6}' emp_3_only.txt 7499 allen 1600 # 等價(jià)于用比較符的形式 awk -F"," '$6>=1300 && $6<1700 {print $1,$2,$6}' emp_3_only.txt? 7499 allen 1600 #結(jié)果 7499 allen 1600#注:如果用到if,則需要把包裹在{}(大括號(hào))內(nèi),而不用if的形式則不需要。IF ELSE語(yǔ)句
IF ELSE此情況僅處理滿足IF條件的邏輯,其它情況在ELSE里處理。
#如果資在1300和1700之間的員工編號(hào)和姓名,否則輸出“比1300小或者大于等于1700”。 awk -F"," '{if($6>=1300 && $6<1700) print $1,$2,$6? else print "比1300小或者大于等于1700"}' emp_3_only.txt # 結(jié)果 比1300小或者大于等于1700 7499 allen 1600 比1300小或者大于等于1700#注:這里的else不能和if在同一行。三目運(yùn)算符
三目運(yùn)算符即是”?:”,?前是條件判斷,如果滿足則進(jìn)入:前的邏輯,反之則反。
# 通過三目運(yùn)算符結(jié)合且(”&&”)進(jìn)行分支判斷,效果類似IF ELSE。 # 這里的需求時(shí)如果工資在[1300,1700)就打印"您工資在合理 范圍[1300,1700)",反之打印"您工資過高或過低[1700,∞) or (-∞,1300)" awk -F"," '{content=$6>=1300 && $6<1700? "您工資在合理 范圍[1300,1700)":"您工資過高或過低[1700,∞) or (-∞,1300)";print $1,content,$6}' emp_3_only.txt #結(jié)果 7369 您工資過高或過低[1700,∞) or (-∞,1300) 800 7499 您工資在合理 范圍[1300,1700) 1600 7521 您工資過高或過低[1700,∞) or (-∞,1300) 1250 # 注:這里如果要多某一列用于三目運(yùn)算符時(shí)需要先賦值給一個(gè)變量,方便后邊的應(yīng)用。比如這里用的是content變量。While循環(huán)
While是循環(huán)的一種形式,即while滿足某個(gè)條件后一直循環(huán)直至不滿足條件后終止。
# 按照記錄序號(hào),計(jì)算計(jì)算員工累加后的工資。 awk -F"," 'BEGIN{total=0;}{rn=1; total = total + $6; while (rn <= 3) {rn+=1;} print total,rn; }' emp_3_only.txt # 結(jié)果 800 4 2400 4 3650 4#延展閱讀: 局部變量 awk -F"," '{total=0;rn=NR; total = total + $6; while (rn <= 3) {rn+=1;} print total,rn; }' emp_3_only.txt # 結(jié)果 800 4 1600 4 1250 4#注:如上所示,這里定義的total可以理解為局部變量,所以沒有疊加的效果。Do While循環(huán)
Do While是while循環(huán)的另外一種形式,先執(zhí)行邏輯后驗(yàn)證是否滿足循環(huán)結(jié)束條件。
#按照記錄序號(hào),計(jì)算計(jì)算員工累加后的工資。 awk -F"," 'BEGIN{total=0;}{rn=0; > total = total + $6; > do > {rn+=1;} > while (rn <= 3) > print total,rn; > }' emp_3_only.txt # 結(jié)果 800 4 2400 4 3650 4For循環(huán)
For循環(huán)是循環(huán)的一種,它可以在定義個(gè)自增變量,設(shè)置結(jié)束條件來控制循環(huán)。
awk -F"," 'BEGIN{total=0;i=1}{ total = total + $6; for(i=1;i<=NR;i++) print total,i; }' emp_3_only.txt#結(jié)果 800 1 2400 1 2400 2 3650 1 3650 2 3650 3# 過程解讀,為啥是這樣? # Step1 因?yàn)閍wk在讀取文件時(shí)就是一種循環(huán) # Step2 我們?cè)诿看巫x取一行時(shí)又加了循環(huán),這時(shí)總體上可以理解為2層循環(huán)。 # Step3 這里用到NR內(nèi)置變量,即行號(hào)。以NR等于2為例。內(nèi)部的FOR循環(huán)會(huì)執(zhí)行2次,因?yàn)槊看味际菑?開始。同理NR等于3時(shí)會(huì)輸出3條記錄。#如何改進(jìn)呢?通過上述分析不難發(fā)現(xiàn)多出來的打印問題處在初始值i上,所以i如果等于NR,則僅會(huì)打印一次。見如下代碼:awk -F"," 'BEGIN{total=0;i=1}{ total = total + $6; for(NR;i<=NR;i++) print total,i; }' emp_3_only.txt 800 1 2400 2 3650 3 #結(jié)果 800 1 2400 2 3650 3Break終止
break關(guān)鍵字是循環(huán)時(shí)滿足某個(gè)條件時(shí)當(dāng)前WHILE循環(huán)結(jié)束,AWK遍歷行循環(huán)仍在繼續(xù)。
awk -F"," 'BEGIN{total=0;rn=0;}{ total = total + $6; while (rn <= 3) {rn+=1; print rn,NR,total; if (rn == 2){ print "終止在第二次迭代" break; } } print total,rn,NR; }' emp_3_only.txt#結(jié)果 1 1 800 2 1 800 終止在第二次迭代 800 2 1 3 2 2400 4 2 2400 2400 4 2 3650 4 3#過程描述 # Step1 :rn有0開始迭代,在外部循環(huán)時(shí)(即awk訪問第一行記錄)時(shí),內(nèi)部循環(huán)進(jìn)行3次,而進(jìn)入第二次時(shí)即終止,所以打印total,rn,NR(外部行號(hào))時(shí)分別為800 2 1。外部循環(huán)遍歷文件行仍繼續(xù)。# Step2: 繼續(xù)遍歷第2、3行,打印當(dāng)前行的total,rn,NR。Continue繼續(xù)
Continue關(guān)鍵字是循環(huán)時(shí)滿足某個(gè)條件時(shí)循環(huán)內(nèi)部略過當(dāng)前條件,當(dāng)前WHILE循環(huán)繼續(xù),AWK遍歷行循環(huán)外部仍在繼續(xù)。
awk -F"," 'BEGIN{total=0;rn=0;}{ > total = total + $6; > while (rn <= 3) > {rn+=1; > print rn,NR,total; > if (rn == 2){ > print "繼續(xù)第2次迭代" > continue; > } > } > print total,rn,NR; > }' emp_3_only.txt 1 1 800 2 1 800 繼續(xù)第2次迭代 3 1 800 4 1 800 800 4 1 2400 4 2 3650 4 3#過程描述 # Step1 :rn有0開始迭代,在外部循環(huán)時(shí)(即awk訪問第一行記錄)時(shí),內(nèi)部循環(huán)進(jìn)行3次,而進(jìn)入第2次時(shí)即仍繼續(xù)循環(huán)(即略過該次迭代),所以打印total,rn,NR(外部行號(hào))時(shí)分別為800 4 1。外部循環(huán)遍歷文件行仍繼續(xù)。# Step2: 繼續(xù)遍歷第2、3行,打印當(dāng)前行的total,rn,NR。Exit退出
Exit關(guān)鍵字是循環(huán)時(shí)滿足某個(gè)條件時(shí)整個(gè)程序結(jié)束,即后續(xù)(外部遍歷文件行)不再執(zhí)行。
# 遍歷到第2行是結(jié)束程序同時(shí)輸出提示文字“終止在第二行”。 awk -F"," 'BEGIN{total=0;rn=0}{ total = total + $6; while (rn <= 3) {rn+=1; if (rn == 2){ print "終止在第二行" exit; } print total,rn; } }' emp_3_only.txt #結(jié)果 800 1 終止在第二行
?
總結(jié)
以上是生活随笔為你收集整理的打开高效文本编辑之门_Linux Awk之条件判断与循环的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三只松鼠沙琪玛一个多少克?
- 下一篇: 肉末豆腐的家常做法?