LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1418|回复: 10

请教awk问题

[复制链接]
发表于 2009-8-21 16:35:16 | 显示全部楼层 |阅读模式
问题1:
$ cat lab5.data
Mike Harrington510) 548-1278:250:100:175
Christian Dobbins408) 538-2358:155:90:201
Susan Dalsass206) 654-6279:250:60:50
Archie McNichol206) 548-1348:250:100:175
Jody Savage206) 548-1278:15:188:150
Guy Quigley916) 343-6410:250:100:175
Dan Savage406) 298-7744:450:300:275
Nancy McNeil206) 548-1278:250:80:75
John Goldenrod916) 348-4278:250:100:175
Chet Main510) 548-5258:50:95:135
Tom Savage:(408) 926-3456:250:168:200
Elizabeth Stachelin:(916) 440-1763:175:75:300

$awk -F: '$6 = ($3+$4+$5){print $0}' lab5.data
525 Harrington (510) 548-1278 250 100 175
446stian Dobbins (408) 538-2358 155 90 201
360n Dalsass (206) 654-6279 250 60 50
525ie McNichol (206) 548-1348 250 100 175
353 Savage (206) 548-1278 15 188 150
525Quigley (916) 343-6410 250 100 175
1025avage (406) 298-7744 450 300 275
405y McNeil (206) 548-1278 250 80 75
525 Goldenrod (916) 348-4278 250 100 175
280 Main (510) 548-5258 50 95 135
618Savage (408) 926-3456 250 168 200
550abeth Stachelin (916) 440-1763 175 75 300

怎么$6都跑到前面来了呀。。我想让它放在最后?
请问怎么解决????


问题2:
同样使用上面的文件
写一个awk的脚本,它的作用:
.显示Savage的全名和电话号码
.显示Chet的捐款
.显示所有头一个月捐款$250的人名.

$ cat facts
# Create a script name is facts and done following work

#1. print Savage's full name and Tel
$1 ~ /Savage/{print $1,$2}

#2. print Chet's 资助金额
#$1 ~ /^Chet/{print $3,$4,$5}

#3. print 所有在第一个月资助了250美元的人
#$3 ~ /250/{print $1,$3}

$ awk -f facts -F: lab5.data
Mike Harrington 250
Susan Dalsass 250
Archie McNichol 250
Jody Savage (206) 548-1278
Guy Quigley 250
Dan Savage (406) 298-7744
Nancy McNeil 250
John Goldenrod 250
50 95 135
Tom Savage (408) 926-3456
Tom Savage 250

这个结果怎么是乱的呀,,没有按照
首先显示Savage的全名和电话号码
其次显示Chet的捐款
最后显示所有头一个月捐款$250的人名
这个顺序呀???
发表于 2009-8-21 19:03:25 | 显示全部楼层
问题一:awk -F : '{print $0 "   " $3+$4+$5}'  lab5.date
回复 支持 反对

使用道具 举报

发表于 2009-8-21 19:14:42 | 显示全部楼层
问题二:显示Savage的全名和电话号码 awk -F : '/Savage/{print $1 "   " $2}' filename
显示chat的捐款:awk -F : '/chat/{print $3 "  " $4 "   " $5}'
显示头一个月捐款250的人名: awk -F : '{if($3==250) print $1}' filename
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-22 12:36:35 | 显示全部楼层
Post by zpcat;2018804
问题一:awk -F : '{print $0 "   " $3+$4+$5}'  lab5.date


不行的呀,还是跟我那个一样的;;

$ awk -F: '{print $0 "" $3+$4+$5}' lab5.data
525e Harrington510) 548-1278:250:100:175
446istian Dobbins408) 538-2358:155:90:201
360an Dalsass206) 654-6279:250:60:50
525hie McNichol206) 548-1348:250:100:175
353y Savage206) 548-1278:15:188:150
525 Quigley916) 343-6410:250:100:175
1025Savage406) 298-7744:450:300:275
405cy McNeil206) 548-1278:250:80:75
525n Goldenrod916) 348-4278:250:100:175
280t Main510) 548-5258:50:95:135
618 Savage:(408) 926-3456:250:168:200
550zabeth Stachelin:(916) 440-1763:175:75:300
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-22 12:38:09 | 显示全部楼层
Post by zpcat;2018808
问题二:显示Savage的全名和电话号码 awk -F : '/Savage/{print $1 "   " $2}' filename
显示chat的捐款:awk -F : '/chat/{print $3 "  " $4 "   " $5}'
显示头一个月捐款250的人名: awk -F : '{if($3==250) print $1}' filename


首先非常感谢你的回复,

单独每条 我知道怎么写,但是把这三条 放到一个脚本里,结果就乱了呀????
回复 支持 反对

使用道具 举报

发表于 2009-8-22 13:35:42 | 显示全部楼层
awk -F: '/Savage/{print $1" "$2};/Chet/{print $1" "$3" "$4" "$5};{if( $3 == 250 ) print $1}'  filename
回复 支持 反对

使用道具 举报

发表于 2009-8-22 23:26:23 | 显示全部楼层
其实是因为你的文件里面有“\r"即回车号。
所以导致了你的输出乱掉,重新定义RS="\r\n"
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-24 09:17:05 | 显示全部楼层
Post by lastart;2019238
其实是因为你的文件里面有“\r"即回车号。
所以导致了你的输出乱掉,重新定义RS="\r\n"


$ awk -v RS="\r\n" -F: '/Savage/{print $1" "$2};/Chet/{print $1" "$3" "$4" "$5};{if( $3 == 250 ) print $1}' lab3.data
Mike Harrington
Susan Dalsass
Archie McNichol
Jody Savage (206) 548-1278
Guy Quigley
Dan Savage (406) 298-7744
Nancy McNeil
John Goldenrod
Chet Main 50 95 135
Tom Savage (408) 926-3456
Tom Savage

结果一样的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-24 09:21:50 | 显示全部楼层
$ cat -A lab3.data
Mike Harrington510) 548-1278:250:100:175^M$
Christian Dobbins408) 538-2358:155:90:201^M$
Susan Dalsass206) 654-6279:250:60:50 ^M$
Archie McNichol206) 548-1348:250:100:175 ^M$
Jody Savage206) 548-1278:15:188:150 ^M$
Guy Quigley916) 343-6410:250:100:175 ^M$
Dan Savage406) 298-7744:450:300:275 ^M$
Nancy McNeil206) 548-1278:250:80:75 ^M$
John Goldenrod916) 348-4278:250:100:175 ^M$
Chet Main510) 548-5258:50:95:135 ^M$
Tom Savage:(408) 926-3456:250:168:200 ^M$
Elizabeth Stachelin:(916) 440-1763:175:75:300 ^M$

是不是跟后面那个符号有关系呀??
回复 支持 反对

使用道具 举报

发表于 2009-8-27 23:54:33 | 显示全部楼层
没看清楚,不好意思,"\r"是你的第一个问题,你原来的写法没错,只是文件有回车所以显示不对。

关于第二个问题这跟awk的处理方式有关,他是读一行处理一行。所以所有结果都叠在一起了。解决办法是最后再输出。
awk -F: '/Savage/{sav[$0]=$1" "$2};/Chet/{che[$0]=$1" "$3" "$4" "$5}; $3==250{s250[$0]=$1} END{print "Savage:";for(a in sav)print sav[a];print "Chet:"; for (a in che) print che[a];print "250:"; for (a in s250) print s250[a];}'  lab3.data
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表