Unix Shell范例精解---AWK练习(上)

Unix Shell范例精解第六章---AWK实用程序中有六个练习题,从简单到复杂,目前做了前面3道题目,后面的3题感觉做起来很吃力,关于循环、数组、函数的题目,不知道要怎么做。

AWK练习1:练习1主要练习的是模式为正则表达式的操作,有些题目可以用书里后面讲解的内容解答

[[email protected] Ex_6.001-6.054]$ cat lab3.data
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 

该数据库包含姓名、电话号码、以及在最近3个月中的竞选捐款数额

1.打印所有的电话号码
awk -F ‘[: ]‘ ‘{print $3,$4 }‘ lab3.data      #设置字段分隔符为冒号和空格

2.打印Dan的电话号码
awk -F ‘[: ]‘ ‘/^Dan/{print $3 $4 }‘ lab3.data            #模式匹配Dan加上相应的动作

3.打印Susan的姓名和电话号码
awk -F ‘[: ]‘ ‘/^Susan/{print $1,$2, $3 $4 }‘ lab3.data

4.打印所有姓以D开头的姓氏
awk -F ‘[: ]‘ ‘$2~/^D/{print $2}‘ lab3.data                #$x ~ /xxx/这种方式很常用

5.打印所有以C或E开头的名字
awk ‘/^[CE]/{print $1}‘ lab3.data

6.打印所有只包含4个字符的名字
awk ‘/^....\>/{print $1}‘ lab3.data                 #这种虽然结果是对的,但是不严谨
awk -F ‘[: ]‘ ‘$1~/^[a-zA-Z]{4}$/{print $1}‘ lab3.data
awk -F ‘[: ]‘ ‘{if(length($1)==4){print $1}}‘ lab3.data      

7.打印所有区号为916的人的名字
awk -F ‘[: ]‘ ‘$3=="(916)"{print $1}‘ lab3.data
awk -F ‘[: ]‘ ‘$3~/916/{print $1}‘ lab3.data

8.打印Mike的资助金额,每一个值要使用美元符号开头,例如“$250$100$175”
awk -F ‘[: ]‘ ‘/^Mike/{print "$"$5"$"$6"$"$7}‘ lab3.data
awk -F ‘[: ]‘ ‘$1~/Mike$/{print "$"$5"$"$6"$"$7}‘ lab3.data

9.打印所有姓,后面跟着一个逗号和名
awk -F ‘[: ]‘ ‘{print $2","$1}‘ lab3.data

10.编写一个名为facts的脚本,并完成下面的工作:
a.打印所有姓氏为Savage的人的全名和电话号码
b.打印Chet的资助金额
c.打印所有在第一个月资助了250美元的人

脚本内容:
#/usr/bin/awk
#打印所有姓氏为Savage的人的全名和电话号码
$2~/Savage$/{print $1,$2,$3,$4}
#打印Chet的资助金额
$1~/Chet$/{print $5,$6,$7}
#打印所有第一个月资助250美元的人
$5~/250$/{print $1,$2}
#执行脚本时要改变FS的值

AWK 练习2 :主要练习模式为比较表达式、关系运算符...等操作

[[email protected] Ex_6.055-6.089]$ cat lab4.data
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

该数据库包含姓名、电话号码、以及在最近3个月中的竞选捐款数额

1.打印在第二个月捐款超过100美元的人的姓名和电话号码
awk -F ‘[: ]‘ ‘$6>100{print $1,$2,$3 $4}‘ lab4.data

2.打印在最后一个月捐款少于85美元的人的姓名和电话号码
awk -F ‘[: ]‘ ‘$7<85{print $1,$2,$3 $4}‘ lab4.data 

3.打印第一个月捐款额在75-150美元之间的人
awk -F ‘[: ]‘ ‘$5>75 && $5<150{print $1,$2}‘ lab4.data 

4.打印这三个月的捐款总额不超过800美元的人
awk -F ‘[: ]‘ ‘($5+$6+47)<800{print $1,$2}‘ lab4.data
awk -F ‘[: ]‘ ‘{if(($5+$6+$7)<800){print $1,$2}}‘ lab4.data 

5.打印月均捐款额大于200美元的人的姓名和电话号码
awk -F ‘[: ]‘ ‘($5+$6+$7)/3>200{print $1,$2,$3 $4}‘ lab4.data
awk -F ‘[: ]‘ ‘{if(($5+$6+$7)/3>200){print $1,$2,$3 $4}}‘ lab4.data

6.打印不在916区的人的姓
awk -F ‘[: ]‘ ‘!($3=="(916)"){print $2}‘ lab4.data 

7.打印每条记录,并在记录前加上记录号
awk ‘{print NR,$0}‘ lab4.data

8.打印每个人的姓名和捐款总额
awk -F ‘[: ]‘ ‘{print $1,$2,$5+$6+$7}‘ lab4.data

9.把Chet第二个月的捐款额加上10
awk -F ‘[: ]‘ ‘/^\<Chet\>/{print $6+10}‘ lab4.data
awk -F ‘[: ]‘ ‘/^\<Chet\>/{$6=$6+10;print}‘ lab4.data 

10.把Nancy McNeil的名字改成Louise McInnes
awk -F ‘[: ]‘ ‘$1=="Nancy" && $2=="McNeil"{$1="Louise";$2="McInnes";print $1,$2 }‘ lab4.data

AWK练习3 :主要练习变量,格式控制、BEGIN END 等操作

[[email protected] Ex_6.090-6.126]$ cat lab5.data
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 

上面这个数据库记录内容包括姓名、电话号码和最近3个月得竞选捐款数额
试编写一个能产生如下输出的nawk脚本:

[[email protected] Ex_6.090-6.126]$ awk -f nawk.sc lab5.data
       ***CAMPAIGN 1998 CONTRIBUTIONS***
--------------------------------------------------------------------------------------
NAME                   PHONE                Jan|     Feb |     Mar  |     Total Donated
--------------------------------------------------------------------------------------
Mike Harrington      (510) 548-1278    250.00  100.00  175.00   525.00
Christian Dobbins   (408) 538-2358    155.00   90.00  201.00   446.00
Susan Dalsass        (206) 654-6279    250.00   60.00   50.00   360.00
Archie McNichol      (206) 548-1348    250.00  100.00  175.00   525.00
Jody Savage            (206) 548-1278     15.00  188.00  150.00   353.00
Guy Quigley             (916) 343-6410    250.00  100.00  175.00   525.00
Dan Savage             (406) 298-7744    450.00  300.00  275.00  1025.00
Nancy McNeil          (206) 548-1278    250.00   80.00   75.00   405.00
John Goldenrod       (916) 348-4278    250.00  100.00  175.00   525.00
Chet Main                 (510) 548-5258     50.00   95.00  135.00   280.00
Tom Savage             (408) 926-3456    250.00  168.00  200.00   618.00
Elizabeth Stachelin  (916) 440-1763    175.00   75.00  300.00   550.00
----------------------------------------------------------------------------------
            SUMMARY
----------------------------------------------------------------------------------
The campaign received a total of 6137.00 for this quarter.           #所有人的捐款总和
The average donation for the 12 contribuors was $511.42.         #平均每人捐款多少
The highest contribution was $450.00.                                            #单月最大捐款
The lowest contribution was $15.00.                                               #单月最低捐款

书本里面字段之间是对齐的,写的脚本输出的格式没有很整齐,脚本内容如下:

[[email protected] Ex_6.090-6.126]$ cat nawk.sc
#/usr/bin/awk
BEGIN { FS=":"
    printf "%40s\n","***CAMPAIGN 1998 CONTRIBUTIONS***"
    print "--------------------------------------------------------------------------------------"
    printf "%-22s %-16s %7s| %7s | %7s | %8s","NAME","PHONE", "Jan", "Feb","Mar","Total Donated\n"
    print "--------------------------------------------------------------------------------------"
    total=0;sum=0;lc=0;highest=0;lowest
}

{
total=$3+$4+$5;sum=sum+total;lc=lc+1
highest=(highest > $3)? highest : $3
highest=(highest > $4)? highest : $4
highest=(highest > $5)? highest : $5
lowest=(lowest==0 || lowest > $3)? $3 : lowest
lowest=(lowest < $4)? lowest : $4
lowest=(lowest < $5)? lowest : $5
printf "%-22s %-16s %7.2f %7.2f %7.2f %8.2f\n",$1,$2,$3,$4,$5,total
}

END {
    printf "----------------------------------------------------------------------------------\n"
    printf "\t\t\tSUMMARY\n"
    printf "----------------------------------------------------------------------------------\n"
    printf "The campaign received a total of %7.2f for this quarter.\n",sum
    printf "The average donation for the 12 contribuors was $%.2f.\n",sum/lc       #或者用sum/NR、sum/12
    printf "The highest contribution was $%.2f.\n",highest
    printf "The lowest contribution was $%.2f.\n",lowest
}
#total变量用于记录每个人3个月捐款总数,sum变量用来记录所有人的捐款总和,lc变量用来记录记录数目(sum/lc和sum/NR都等于sum/12 ),highest和lowest变量用来处理最大值和最小值。

总结:感觉awk学起来很困难,内容很多,书中后面的练习也做不出来,需要用到数组、函数、循环之类的功能,感觉awk脚本比bash脚本要难写。

原文地址:https://blog.51cto.com/pkimin3/2427025

时间: 2024-10-12 06:53:44

Unix Shell范例精解---AWK练习(上)的相关文章

CUDA范例精解通用GPU架构-(2)其实写个矩阵相乘并不是那么难

程序代码及图解析: #include <iostream> #include "book.h" __global__ void add( int a, int b, int *c ) { *c = a + b; } int main( void ) { int c; int *dev_c; HANDLE_ERROR( cudaMalloc( (void**)&dev_c, sizeof(int) ) ); add<<<1,1>>>

Linux主要shell命令详解(上)

[摘自网络] kill -9 -1即实现用kill命令退出系统 Linux主要shell命令详解 [上篇] shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的是Bash.本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性. 什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口.它是命令语言.命令解释程序及程序设计语言的统称. shell是用户和Linux内核之间的接口程序,如果把

《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内容主要都是介绍如何在屏幕上显示图像,事实上除了图像之外,音乐的播放也可以被理解为一种显示的方式,本节将学习在Cocos2d-x中播放声音的方法. (1)在HelloWorld.h中对HelloWorld类进行如下定义: class HelloWorld : public Cocos2d::Layer { pu

Linux Unix shell 编程指南学习笔记(第一部分)

第一章:文件安全与权限: 1.文件和目录的权限 创建文件时系统保存了文件所有相关的信息,包括 文件的位置 . 文件类型 . 文件长度 . 哪位用户拥有该文件,哪些用户可以访问该文件 . i 节点 . 文件的修改时间 . 文件的权限位 . 文件类型: d: 目录 l : 符号链接(指向另一个文件) s: 套接字文件 b: 块设备文件 c: 字符设备文件 p: 命名管道文件 -: 不属于上述类型的文件 文件权限 XXX       XXX        XXX 最左边 XXX : 文件属主 权限位

sed实例精解--例说sed完整版

原文地址:sed实例精解--例说sed完整版 作者:xiaozhenggang 最近在学习shell,怕学了后面忘了前面的就把学习和实验的过程记录下来了.这里是关于sed的,前面有三四篇分开的,现在都把它们弄到了一起,并做了一些调整,二十多页,有点长啦.不过大部分都是例子来着,呵呵. 在电脑前坐太久了还真是不行,脖子都歪啦!强烈建议各位找点时间多动动,多动动!还是身体重要嘛!!! 我的实验环境是: fedora 14 ,bash. 在实验中遇到了一些问题,都在后面的例子中提到啦.有些问题纠结了好

Oracle PLSQL 实例精解 中文版pdf

下载地址:网盘下载 <Oracle PLSQL 实例精解>是一本逐步分解的,详尽的pl/sql编程教程,使用真实场景的试验.范例和练习来介绍读者所需的pl/sql编程技能,涵盖oracle 11g的最新特性.作者的写作手法源自于在哥伦比亚大学教授pl/sql编程技术的经验,深度探索pl/sql编程技术,融合自己的最佳实践.使用本书,读者可以快速掌握pl/sql编程基本知识,并建立工程化的概念,是市面上难得的pl/sql教程.下载地址:网盘下载

linux主要shell命令详解

Linux主要shell命令详解 shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的是Bash.本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性. 什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口.它是命令语言.命令解释程序及程序设计语言的统称. shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层.当从sh

【刘文彬】【精解】开发一个智能合约

原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/contract.html 智能合约 这两天被老大搞去搬砖,学习计划有变但无大碍,这篇文章将仔细分析智能合约相关内容. 关键字:智能合约,remix,Solidity,truffle,geth,leveldb,datadir,ganache,web3j 合约 合约也称合同.协议,是甲乙双方参与的,制定一系列条目规范双方权利与义务的文件.智能合约是电子化的,自动执行的,去中心化的,具有不可抵赖性,本质上它

好程序员大数据分享:Hbase精解

好程序员大数据分享:Hbase精解,为什么有hbase?hbase是什么?Hbase的架构. 一. 为什么有hbase? 数据量越来越大,传统的关系型数据库不能满足存储和查询的需求.而hive虽然能满足存储的要求,但是hive不能满足非结构化.半结构化数据的存储和查询. 二.hbase是什么? hbase是一个开源的.分布式的.多版本的.可扩展的非关系型数据库.hbase是bigtable的开源java版本,建立在hdfs之上,提供高可靠性的.高性能.列式存储.可伸缩.实时读写的nosql数据库