linux awk高级应用实例

今天看到unix shell 范例精解上有道awk的题目 做了以后拿来和大家分享下

处理前的文档:

Mike Harrington:(510) 548-1278:250:100:175
 Christian Dobbins:(408) 538-2358:155:90:201
 Susan Dalsass:(206) 654-6279:250:60:50
 Archie McNichol:(206) 548-1348:250:100:175
 Jody Savage:(206) 548-1278:15:188:150
 Guy Quigley:(916) 343-6410:250:100:175
 Dan Savage:(406) 298-7744:450:300:275
 Nancy McNeil:(206) 548-1278:250:80:75
 John Goldenrod:(916) 348-4278:250:100:175
 Chet Main:(510) 548-5258:50:95:135
 Tom Savage:(408) 926-3456:250:168:200
 Elizabeth Stachelin:(916) 440-1763:175:75:300

需要的结果如下:
                ***CAMPAIGN 1998 CONTRIBUTIONS***

Name                   PHone                   Jan |   Feb |   MAR |   Total Donated
---------------------------------------------------------------------------------
 
Mike Harrington         (510) 548-1278          250     100     175     525
Christian Dobbs         (408) 538-2358          155     90      201     446
Susan Dalsass           (206) 654-6279          250     60      50      360
Archie McNichol         (206) 548-1348          250     100     175     525
Jody Savage             (206) 548-1278          15      188     150     353
Guy Quigley             (916) 343-6410          250     100     175     525
Dan Savage              (406) 298-7744          450     300     275     1025
Nancy McNeil            (206) 548-1278          250     80      75      405
John Goldenrod          (916) 348-4278          250     100     175     525
Chet Main               (510) 548-5258          50      95      135     280
Tom Savage              (408) 926-3456          250     168     200     618
Elibeth Stachel         (916) 440-1763          175     75      300     550

SUMMARY
-----------------------------------------------------------------------------------
The campan received atotal of $6137 for this quarter
average donation for the 12 contributors was $511.417.
The highest contribution was $450.
The lowest contribution was $15.

代码如下:

BEGIN{FS=":";low1=300;low2=400;low3=500
    OFS="\t"
    print "\t\t***CAMPAIGN 1998 CONTRIBUTIONS***\n"
    print "---------------------------------------------------------------------------------\n"
    print " Name\t\t\tPHone\t\t\tJan |\tFeb |\tMAR |\tTotal Donated"
    print "---------------------------------------------------------------------------------\n"
    }

{tot=$3+$4+$5}
{Ttot+=tot}
{print $1,"\t"$2"\t\t"$3" \t"$4" \t"$5" \t"tot}
{avg=Ttot/12}
{high1=(high1>$3)?high1:$3}
{high2=(high1>$4)?high1:$4}
{high3=(high1>$5)?high1:$5}
{max12=(high1>high2)?high1:high2}
{max23=(high2>high3)?high2:high3}
{Max=(max12>max23)?max12:max23}
{low1=(low1<$3)?low1:$3}
{low2=(low1<$4)?low1:$4}
{low3=(low1<$5)?low1:$5}
{min12=(low1<low2)?low1:low2}
{min23=(low2<low3)?low2:low3}
{Min=(min12<min23)?min12:min23}

END{
    print "-----------------------------------------------------------------------------------"
    print"\t\tSUMMARY"
    print "-----------------------------------------------------------------------------------"
    printf "The campan received atotal of $";printf Ttot; print " for this quarter"
    printf "average donation for the 12 contributors was $"; printf avg ;print"."
    printf "The highest contribution was $";printf Max;print "."
    printf "The lowest contribution was $";printf Min;print "."
}
(0)

相关推荐

  • 一天一个shell命令 linux文本内容操作系列-awk命令详解

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK

  • linux文本分析awk基础命令介绍(8)

    awk是一种模式扫描和处理语言,在对数据进行分析处理时,是十分强大的工具. awk [options] 'pattern {action}' file... awk的工作过程是这样的:按行读取输入(标准输入或文件),对于符合模式pattern的行,执行action.当pattern省略时表示匹配任何字符串:当action省略时表示执行'{print}':它们不可以同时省略. 每一行输入,对awk来说都是一条记录(record),awk使用$0来引用当前记录: [root@centos7 ~]#

  • linux shell awk获得外部变量(变量传值)简介

    AWK 提供了极其强大的功能: 可以进行正则表达式的匹配 样式装入 流控制 数学运算符 进程控制语句 内置的变量和函数 可以把awk看作一门完全的程序设计语言,它处理文本的速度是快得惊人的.现在很多基于shell 日志分析工具都可以用它完成.设计简单,速度表现很好. 涉及到以上六个方面内容,我会在以后文章中加以介绍. 这次主要说下,怎么样把外部变量传入到awk执行语句中. 一.基础: awk [ -F re] [parameter...] ['pattern {action}' ] [-f pr

  • Linux里awk中split函数的用法小结

    The awk function split(s,a,sep) splits a string s into an awk array a using the delimiter sep. set time = 12:34:56set hr = `echo $time | awk '{split($0,a,":" ); print a[1]}'` # = 12set sec = `echo $time | awk '{split($0,a,":" ); print

  • linux awk时间计算脚本及awk命令详解

    在linux如果计划时间是个麻烦事, 用awk脚本如下 BEGIN {FS=":";OFS=":"} {total_seconds=total_seconds+$3} total_seconds>=60 {total_seconds=total_sconds-60 $2=$2+1 } {total_minutes=total_minutes+$2 $2=$2+1 } {total_minutes=total_minutes+$2} total_minutes&

  • linux正则表达式awk详解

    awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行.awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的.awk常用来分段: awk不用加任何参数就可以实现 + ? * .  | 这些特殊符号: 1.截取文档中的某个段 [root@yonglinux ~]# head -n2 passwd |awk -F: '{print $1}' root bin [root@yonglinux ~]# head -n2 passwd |awk -F: '{

  • linux之awk命令的用法

    先来一个例子:文件a,统计文件a的第一列中是浮点数的行的浮点数的平均值.用awk来实现只需要一句话就可以搞定$cat a1.021 331#.ll   442.53 6ss    7 awk 'BEGIN{total = 0;len = 0} {if($1~/^[0-9]+\.[0-9]*/){total += $1; len++}} END{print total/len}' a(分析:$1~/^[0-9]+\.[0-9]*/表示$1与"/ /"里面的正则表达式进行匹配,若匹配,则t

  • linux用户与文件基础命令介绍(1)

    linux系统是一个多用户多任务的分时操作系统,但系统并不能识别人,它通过账号来区别每个用户.每个linux系统在安装的过程中都要为root账号设置密码,这个root即为系统的第一个账号.每一个用这个账号登录系统的用户都是超级管理员,他们对此系统有绝对的控制权.通过向系统管理员进行申请,还可以为系统创建普通账号.每个用普通账号登录系统的用户,对系统都只有部分控制权. 我们知道计算机中的数据是以二进制0.1的形式存储在硬件之上的.在linux中,为了管理的方便,系统将这些数据组织成目录和文件,并以

  • linux Shell脚本里面把一个数组传递到awk内部进行处理

    前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分享. 测试环境: [root]# head -1 /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 (Santiago) [root]# awk --version | head -1 GNU Awk 3.1.7 众所周知

  • linux网络相关命令汇总(6)

    本文将讲述网络相关命令,作者假定读者具备TCP/IP协议栈的基础知识.对于相关命令及其输出只介绍它的基本的使用方法和大概的描述,具体协议将不作详细解释. 如今网络无疑是很重要的,linux系统中提供了丰富的网络测试与管理命令.我们来一起看看它们. 内容如下: 1.ping 发送TCMP回显请求报文,并等待返回TCMP回显应答. ping [OPTIONS]... destination 这里的目标destination可以是目的IP地址或者域名/主机名 选项-c指定发送请求报文的次数,当ping

随机推荐