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