awk 條件及循環語句和字符串函數


條件語句

    if(條件表達式)
        動作1
    else if(條件表達式)
        動作2
    else
        動作3

  

循環語句:

    while循環:
    while(條件表達式)
        動作


    do while循環:
        do
            動作
        while(條件表達式)
    

    for循環:
        for(初始化計數器;計數器測試;計數器變更)
            動作

  

以:為分隔符,只打印/etc/passwd中第3個字段的數值在50-100范圍內的行信息

awk 'BEGIN{FS=":"}{if($3>50 && $3<100) print $0}' passwd

if.awk  

        BEGIN{
            FS=":"
        }
        {
            if($3<50)
            {
                printf "%-20s%-20s%-10d\n","UID<50",$1,$3
            }
            else if ($3>50 && $3<100)
            {
                printf "%-20s%-20s%-10d\n","50<UID<100",$1,$3
            }
            else 
            {
                printf "%-20s%-20s%-10d\n","UID>100",$1,$3
            }
        }

  

輸出 以 UID 以50位為分界點的用戶,-f 將條件表達式寫到文本中讀取

awk -f if.awk passwd 

 

計算下列每個同學的平均分數,並且只打印平均分數大於90的同學姓名和分數信息

        Allen    80    90    96    98
        Mike    93    98    92    91
        Zhang    78    76    87    92
        Jerry    86    89    68    92
        Han    85    95    75    90
        Li    78    88    98    100

算出平局成績
awk 'BEGIN{printf "%-20s%-20s%-20s%-20s%-20s%-20s\n","Name","Chinese","English","Math","Physical","Average"}{sum=$2+$3+$4+$5;avg=sum/4}
{printf "%-20s%-20d%-20d%-20d%-20d%-0.2f\n",$1,$2,$3,$4,$5,avg}' student.txt

  

 

加入條件判斷,如果平均分數大於90才打印

awk 'BEGIN{printf "%-20s%-20s%-20s%-20s%-20s%-20s\n","Name","Chinese","English","Math","Physical","Average"}{sum=$2+$3+$4+$5;avg=sum/4}{if(avg>90)
 printf "%-20s%-20d%-20d%-20d%-20d%-0.2f\n",$1,$2,$3,$4,$5,avg}' student.txt 

 

計算1+2+3+4+...+100的和,請使用while、do while、for三種循環方式實現

  

通過讀取文件的方式載入awk的條件

add_while.awk

        BEGIN{
            while(i<=100)
            {
                # 一個變量不賦值,默認為0或者空
                sum+=i
                i++
            }    
            print sum
        }

do while循環

awk -f add_dowhile.awk

for循環

add_for.awk

        BEGIN{
            for(i=0;i<=100;i++) 
            {
                sum+=i
            }
            print sum
        }

 

字符串函數對照表

 

案例演示

以 : 為分隔符, 返回/etc/passwd中每行中每個字段的長度

len.wak

BEGIN{
    FS=":"
}
{
    i=1
    while(i<=NF)
    {
        if (i==NF)
        {
            printf "%d",length($i)
        }
        else
        {
            printf "%d:",length($i)
        }
        i++
    }
    print ""
}

 

awk -f len.awk passwd

 

搜索字符串"I have a dream"中出現"ea"字符串的位置

awk 'BEGIN{str="I have a gream";printf "%d\n",index(str,"ea")}'

 

將字符串"Hadoop is a bigdata Framework"全部轉換為小寫

awk 'BEGIN{str="Hadoop is a bigdata Framework";print tolower(str)}'

 

將字符串"Hadoop is a bigdata Framework"全部轉換為大寫

awk 'BEGIN{str="Hadoop is a bigdata Framework";print toupper(str)}'

 

將字符串"Hadoop Kafka Spark Storm HDFS YARN Zookeeper",按照空格為分隔符,分隔

awk 'BEGIN{str="Hadoop Kafka Spark Storm HDFS YARN Zookeeper";split(str,arr);for (i in arr) print arr[i];}'

 

搜索字符串"Transaction 2345 Start:Select * from master"第一個數字出現的位置

awk 'BEGIN{str="Transaction 2345 Start:Select * from master";print match(str,/[0-9]/)}'

 

截取字符串"transaction start"的子串,截取條件從第4個字符開始,截取5位

awk 'BEGIN{str="transaction start";print substr(str,4,5)}'

 

替換字符串"Transaction 243 Start,Event ID:9002"中第一個匹配到的數字串替換為$符號

awk 'BEGIN{str="Transaction 243 Start,Event ID:9002";count=sub(/[0-9]+/,"$",str);print count;print str}'

 

gsub是替換全部匹配到的數字 (通過 // 寫正則表達式 )

awk 'BEGIN{str="Transaction 243 Start,Event ID:9002";count=gsub(/[0-9]+/,"$",str);print count;print str}'

 

在awk中數組下標從1開始

awk 'BEGIN{str="Hadoop Kafka Spark Storm HDFS YARN Zookeeper";split(str,arr," ");print arr[0]}'

 

 

awk 'BEGIN{str="Hadoop Kafka Spark Storm HDFS YARN Zookeeper";split(str,arr," ");for(i in arr) {print arr[i]}}' 

 

  

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM