awk命令大练习

回复 收藏

文件:datafile
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

上面的数据库中包含名字,电话号码和过去三个月里的捐款
1.显示所有电话号码

2.显示Dan的电话号码
3.显示Susan的名字和电话号码


4.显示所有以D开头的姓


5.显示所有以一个C或E开头的名


6.显示所有只有四个字符的名



7.显示所有区号为916的人名


8.显示Mike的捐款.显示每个值时都有以$开头.如$250$100$175


9.显示姓,其后跟一个逗号和名,如Jody,Savage


10.写一个awk的脚本,它的作用:
.显示Savage的全名和电话号码
.显示Chet的捐款
.显示所有头一个月捐款$250的人名.
注:区号本来是圆括号表示的。


11.写一个awk脚本,它的作用
. 输出所有人的的捐款总数
. 输出12个人的捐款平均数
. 输出单个季度捐款数最大值
. 输出单个季度捐款数的最小值
2015-12-15 21:51 举报
已邀请:
0

jinm

赞同来自:

谢谢分享
0

369666951

赞同来自:

mark
0

qiaoxin360

赞同来自:

1.显示所有电话号码
awk -F':' '{print $2}' ./datafile.txt

2.显示Dan的电话号码
awk -F'( |:)' '$1=="Dan"{print $3$4}' ./datafile.txt
3.显示Susan的名字和电话号码
awk -F'( |:)' '$1=="Susan"{print $1" "$3$4}' ./datafile.txt

4.显示所有以D开头的姓
awk -F'( |:)' '$2~"^D"{print $2}' ./datafile.txt

5.显示所有以一个C或E开头的名
awk '/^(C|E)/{print $1}' ./datafile.txt

6.显示所有只有四个字符的名
awk '/^[a-zA-Z]{4} /{print $1}' ./datafile.txt


7.显示所有区号为916的人名
awk -F':' '/[916]/{print $1}' ./datafile.txt

8.显示Mike的捐款.显示每个值时都有以$开头.如$250$100$175
awk -F':' '/^Mike /{print "$"$3"$"$4"$"$5}' ./datafile.txt

9.显示姓,其后跟一个逗号和名,如Jody,Savage
awk -F'( |:)' '{print $2","$1}' ./datafile.txt
awk
10.写一个awk的脚本,它的作用:   ////不会awk脚本////
.显示Savage的全名和电话号码
awk -F':' '/Savage/{print $1$2}' ./datafile.txt
.显示Chet的捐款
awk -F':' '/Chet/{print "$"$3"$"$4"$"$5}' ./datafile.txt
.显示所有头一个月捐款$250的人名.
awk -F':' '$3==250{print $1}' ./datafile.txt
注:区号本来是圆括号表示的。


11.写一个awk脚本,它的作用
. 输出所有人的的捐款总数
awk -F':' '{S=S+$3+$4+$5}; END {print S}' ./datafile.txt
. 输出12个人的捐款平均数
awk -F':' '{S=S+$3+$4+$5}; END {print S/12}' ./datafile.txt
. 输出单个季度捐款数最大值
////不会////
. 输出单个季度捐款数的最小值
////不会////
0

369666951

赞同来自:

谢谢分享
0

loveyouhyf

赞同来自:

本帖最后由 loveyouhyf 于 2015-12-17 19:58 编辑

不错,感谢分享,今参考各位高手,折腾了两天终与把11题做出来了,见如下,请参考!
#! /bin/bash
##写于2015-12-17
a=`wc -l < datafile`;echo "现在总人数为:" $a
awk -F ':' '{sum=sum+$3+$4+$5};END {print "所有人总捐款为:"sum}' datafile
awk -F ':' '{sum=sum+$3+$4+$5};END {print "每人平均捐款为:"sum/NR}' datafile
aa=()
for i in `seq 1 $a` ;do
aa[$i]=`awk -F ':' '{if (NR=='"$i"'){sum=$3+$4+$5}};END {print sum}' datafile`
done
max=${aa[1]}
for i in `seq 1 $a`
do
    if [ ${aa[$i]} -gt $max ];then max=${aa[$i]};fi
done
echo "单个季度捐款数最大值为:"$max
min=${aa[1]}
for i in `seq 1 $a`
do
    if [ ${aa[$i]} -lt $min ];then min=${aa[$i]};fi
done
echo "单个季度捐款数最小值为:"$min



0

默写

赞同来自:

感谢分享~
0

jinm

赞同来自:

qiaoxin360 发表于 2015-12-16 21:41
1.显示所有电话号码
awk -F':' '{print $2}' ./datafile.txt

第7题写错了
awk -F':' '/(916)/{print $1}'
0

jinm

赞同来自:

jinm 发表于 2015-12-18 16:31
第7题写错了
awk -F':' '/(916)/{print $1}'

我这样写好像也不对……
0

jinm

赞同来自:

qiaoxin360 发表于 2015-12-16 21:41
1.显示所有电话号码
awk -F':' '{print $2}' ./datafile.txt

第7题   awk -F '( |:)' '$3=="[916]"{print $1,$2}'
0

yanggang

赞同来自:

daan
0

rolay8

赞同来自:

  1. awk -F ":" '{print $2}' im.txt

  2. awk -F ':' '/Dan/ {print $2}' im.txt

  3. awk -F ':' '/Susan/ {OFS=":";print $1,$2}' im.txt

  4. awk -F '[ |:]' '$2 ~ /^D/ {print $1,$2}' im.txt

  5. awk -F ':' '/^[C|E]/ {print $1}' im.txt

  6. awk -F '[ |:]' '{if(length($1) == 4) print $1,$2}' im.txt

  7. awk -F '[ |:]' '$3 ~ /916/ {print $1,$2}' im.txt

  8. awk -F ':' '/Mike/ {OFS=","; print "$"$3,"$"$4,"$"$5}' im.txt

  9. awk -F '[ |:]' '{OFS=","; print $1,$2}' im.txt


0

hlymlv

赞同来自:

本帖最后由 hlymlv 于 2016-1-10 11:16 编辑

6. awk -F ':' '{print $1}' file |awk -F ' ' '{if (length($1)==4) {print $1}}'
7.awk -F ':' '$2~/\[916\]/ {print $1}' file
8. grep "^Tom" file |awk -F ':' 'OFS="$" {print $3,$4,$5}'
9. awk -F ':' '{print $1}' file|awk -F ' ' 'OFS=","{print $1,$2}'
10.awk -F ':' '$1~/Savage/{print $1,$2}' file
awk -F ':' '$1~/Chet/{print $3,$4,$5}' file
awk -F ':' '$3=="250" {print $1}' file

11.感觉写的复杂了,还有平均数的小数部分没能输出来
#!/bin/bash
l=`cat file | wc -l`
for i in `seq 1 $l`;do
m=`awk -F ':' '{print $3}' file|sed -n "$i"p`
sum_1=$[$sum_1+$m]
n=`awk -F ':' '{print $4}' file|sed -n "$i"p`
sum_2=$[$sum_2+$n]
o=`awk -F ':' '{print $5}' file|sed -n "$i"p`
sum_3=$[$sum_3+$o]
done
sum=$[$sum_1+$sum_2+$sum_3]
aver=$[$sum/12]
max_1=`awk -F ':' '{print $3}' file |sort -nr|sed -n '1'p`
max_2=`awk -F ':' '{print $4}' file |sort -nr|sed -n '1'p`
max_3=`awk -F ':' '{print $5}' file |sort -nr|sed -n '1'p`
max=$max_1
if [ $max_2 -gt $max ];then
max=$max_2
elif [ $max_3 -gt $max ];then
max=$max_3
fi
echo "所有人捐款总数为:$sum"
echo "捐款平均数为:$aver"
echo "单个月捐款数最大值:$max"
最小值类似,理解错了  待会再把按季度算的贴出来
大致就是这样了
11.
#!/bin/bash
max=0
min=100000000
l=`cat file | wc -l`
for i in `seq 1 $l`;do
m=`awk -F ':' '{print $3}' file|sed -n "$i"p`
sum_1=$[$sum_1+$m]
n=`awk -F ':' '{print $4}' file|sed -n "$i"p`
sum_2=$[$sum_2+$n]
o=`awk -F ':' '{print $5}' file|sed -n "$i"p`
sum_3=$[$sum_3+$o]
a=$[$m+$n+$o]
if [ $a -gt $max ];then
max=$a
fi
if [ $a -lt $min ];then
min=$a
fi
done
sum=$[$sum_1+$sum_2+$sum_3]
aver=$[$sum/12]
echo "所有人捐款总数为:$sum"
echo "捐款平均数为:$aver"
echo "单个季度捐款数最大值:$max"
echo "单个季度捐款数最小值:$min"
min 和max 都是设定的值,以便if执行替换的




0

snake

赞同来自:

第六题   awk -F'( |:)' 'length($1)==4 {print $1}' awk.txt
0

hlymlv

赞同来自:

本帖最后由 hlymlv 于 2016-1-10 10:00 编辑

学习了
0

hlymlv

赞同来自:

loveyouhyf 发表于 2015-12-17 19:47
不错,感谢分享,今参考各位高手,折腾了两天终与把11题做出来了,见如下,请参考!
#! /bin/bash
##写于 ...

测了 不对啊
[root@lazy ~]# sh 2.sh
现在总人数为: 12
所有人总捐款为:6137
每人平均捐款为:511.417
单个季度捐款数最大值为:1025
单个季度捐款数最小值为:280
0

loveyouhyf

赞同来自:

hlymlv 发表于 2016-1-10 10:01
测了 不对啊
[root@lazy ~]# sh 2.sh
现在总人数为: 12

不知你觉得那里不对呢??
0

hlymlv

赞同来自:

本帖最后由 hlymlv 于 2016-1-10 10:37 编辑
loveyouhyf 发表于 2016-1-10 10:20
不知你觉得那里不对呢?? 不好意思  理解错了,最大值和最小值都应该是按3个月的算  我算成一个月的了
0

hlymlv

赞同来自:

loveyouhyf 发表于 2016-1-10 10:20
不知你觉得那里不对呢??

兄弟  给你分享个命令,从你那学来的 你可以试试
[root@lazy ~]# awk -F ':' '{sum=$3+$4+$5} {print sum}' file
525
446
360
525
353
525
1025
405
525
280
618
550
0

hlymlv

赞同来自:

11.
#!/bin/bash
sum=`awk -F ':' '{sum=sum+$3+$4+$5};END {print sum}' file`
aver=`awk -F ':' '{sum=sum+$3+$4+$5};END {print sum/NR}' file`
max=`awk -F ':' '{sum=$3+$4+$5}{ print sum}' file |sort -nr|sed -n '1'p`
min=`awk -F ':' '{sum=$3+$4+$5}{ print sum}' file |sort -n|sed -n '1'p`
echo "捐款总数:$sum"
echo "捐款平均数:$aver"
echo "单个季度捐款最多:$max"
echo "单个季度捐款最少:$min"
0

loveyouhyf

赞同来自:

本帖最后由 loveyouhyf 于 2016-1-10 15:36 编辑
hlymlv 发表于 2016-1-10 12:03
11.
#!/bin/bash
sum=`awk -F ':' '{sum=sum+$3+$4+$5};END {print sum}' file`

0

ayuan124

赞同来自:

1.显示所有电话号码
[root@localhost ~]# awk -F ':' '{print $2}' datafile

2.显示Dan的电话号码
[root@localhost ~]# awk -F ':' '$1~/Dan/{print $2}' datafile

3.显示Susan的名字和电话号码
[root@localhost ~]# awk -F ':' '$1~/Susan/{print $1":"$2}' datafile

4.显示所有以D开头的姓
[root@localhost ~]# awk -F ':' '{print $1}' datafile | awk '{print $2}' | awk '/^D/'

5.显示所有以一个C或E开头的名
[root@localhost ~]# awk '$1~/^[C|E]/{print $1}' datafile

6.显示所有只有四个字符的名
[root@localhost ~]# awk 'length($1)=="4"{print $1}' datafile

7.显示所有区号为916的人名
[root@localhost ~]# awk '$2~/916/{print $1}' datafile

8.显示Mike的捐款.显示每个值时都有以$开头.如$250$100$175
[root@localhost ~]# awk -F ':' '$1~/^Mike/{print "$"$3":" "$"$4":" "$"$5}' datafile

9.显示姓,其后跟一个逗号和名,如Jody,Savage
[root@localhost ~]# awk -F ':' '{print $1}' datafile |awk '{print $1","$2}'
0

flyingfishzxf

赞同来自:

1. awk -F ":" '{print $2}' datafile

2. awk -F ":" '/Dan/ {print $2}' datafile

3. awk -F ":" '/Susan/ {print $1,$2}' datafile

4. awk -F ":" '{print $1}' datafile |awk '$2~/^D/ {print $2}'

5. awk -F ":" '{print $1}' datafile |awk '$1~/^[CE]/ {print $1}'

6. ?

7. awk -F ":" '{print $1,$2}' datafile |awk '$3~/916/ {print $1}'

8. awk -F ":" '/Mike/ {print "\$"$3,"\$"$4,"\$"$5}' datafile

9. awk -F ":" '{print $1}' datafile |awk 'OFS="," {print $1,$2}'

10.
0

jxcia2018

赞同来自:

本帖最后由 jxcia 于 2016-3-9 19:14 编辑

1.显示所有电话号码 awk -F ':' '{print $2}' datafile
2.显示Dan的电话号码 awk -F ':' '$1~/Dan/ {print $2}' datafile

3.显示Susan的名字和电话号码 awk -F ':' '$1~/Susan Dalsass/ {print $1,$2}' datafile

4.显示所有以D开头的姓 awk -F ':' '$1~/.* D.*/ {print $1}' datafile |sed -r 's/(^[a-Z]+)//g'

5.显示所有以一个C或E开头的名 awk -F ':' '$1~/^[CE]/ {print $1}' datafile |awk  '{print $1}'
6.显示所有只有四个字符的名  不會  
7.显示所有区号为916的人名 awk -F ':'  '$2~/\[916\]/ {print $1}' datafile |awk '{print $1}'  


8.显示Mike的捐款.显示每个值时都有以$开头.如$250$100$175 awk -F ':' '$1~/Mike/  {print $3"$"$4"$"$5}' datafile awk -F ':'  '{OFS="$"}
$1~/Mike/  {print $3,$4,$5}' datafile


9.显示姓,其后跟一个逗号和名,如Jody,Savage awk -F ':' '{print $1}' datafile |awk '{OFS=","} {print $2 ,$1}' ps: 應該是Savage ,Jody吧


10.写一个awk的脚本,它的作用: .显示Savage的全名和电话号码 .显示Chet的捐款 .显示所有头一个月捐款$250的人名. 注:区号本来是圆括号表示的。 #!bin/bash #This is Savage name and telephone number awk -F ':' '$1~/Savage/{print $1 ,$2} ' datafile #Show Chet donation awk -F ':' '$1~/Chet/ {(sum=$3+$4+$5)} ; END {print sum}' datafile #Show all donation of $250 a month name awk -F ':' '$3==250 {print $1}' datafile :


11.写一个awk脚本,它的作用 . 输出所有人的的捐款总数 . 输出12个人的捐款平均数 . 输出单个季度捐款数最大值 . 输出单个季度捐款数的最小值  會用到求和的語句嗎?表示不會

0

m.chang

赞同来自:

学习了。
0

thedawn

赞同来自:

1
0

visaqiuqiu

赞同来自:

不会,先看下答案

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: