当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 10 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : awk脚本错误
帖子发表于 : 2007-12-21 10:50 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
我要做的是找出file_1和file_2中,第一个字段相同的,放到另一个文件里。
脚本如下,出错的在while那行。

引用:
#!/bin/bash

awk '
BEGIN {
FS="[ \t,]+"
while(getline<"file_1" >0) Tstring[$1]++
close("file_1")
}
{
while(getline<"file_2" >0) if( Tstring[$1]>0 ) {print $0 >"add_temp"}#错误就在这里
}
' $


谢谢。


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-12-21 11:32 

注册: 2006-07-09 12:22
帖子: 1331
地址: 南京
送出感谢: 0 次
接收感谢: 1
代码:
while(getline<"file_2" >0) {
if( Tstring[$1]>0 ) {
print $0 >"add_temp"
}
}

貌似你的body没有大括号


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-12-21 11:36 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
hello aBiNg, 我加了大括号以后还是不正确。
Thank you for your help. :)


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-12-21 12:16 

注册: 2006-07-09 12:22
帖子: 1331
地址: 南京
送出感谢: 0 次
接收感谢: 1
你举个例子吧,开始的BEGIN也许有问题,上面的while的body也没有大括号。


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-12-21 12:52 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
aBiNg, 加了大括号以后脚本是工作了,我刚才说没有用,是因为脚本运行以后,不会自己退出来,我用ctrl+c取消的。后来发现重定向的文件已经生成了。

例子:
引用:
file_1:

aaa,1111111111
bbb,2222222222
ccc,3333333333



引用:
file_2:

abc,11
bbb,22
cde,33



把脚本改成
引用:
#!/bin/bash

awk '
BEGIN {
FS="[ \t,]+"
while(getline<"file_1" >0) Tstring[$1]++
close("file_1")
}
{
while(getline<"file_2" >0) {print $1 } #直观一点,就直接print出来
close("file_2")
}

' $*

脚本运行以后,按回车,就一直在while那行,不结束了。请问是什么问题?

Thanks again:)


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-12-21 13:05 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
DerekTan 写道:
aBiNg, 加了大括号以后脚本是工作了,我刚才说没有用,是因为脚本运行以后,不会自己退出来,我用ctrl+c取消的。后来发现重定向的文件已经生成了。

例子:
引用:
file_1:

aaa,1111111111
bbb,2222222222
ccc,3333333333



引用:
file_2:

abc,11
bbb,22
cde,33



把脚本改成
引用:
#!/bin/bash

awk '
BEGIN {
FS="[ \t,]+"
while(getline<"file_1" >0) Tstring[$1]++
close("file_1")
}
{
while(getline<"file_2" >0) {print $1 } #直观一点,就直接print出来
close("file_2")
}

' $*

脚本运行以后,按回车,就一直在while那行,不结束了。请问是什么问题?

Thanks again:)


其实脚本没啥错的,但是你直接运行这个脚本的话,就相当于运行了一条 awk 命令,然没有指定输入参数.
你可以把"while(getline<"file_2" >0)" 这段去掉,然后在命令行里面 ./xx.sh file_2
这样就可以了.


_________________
关注我的blog: ε==3


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-12-21 13:08 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
另外自荐一下我的 awk 手册: http://bones7456.blog.ubuntu.org.cn/200 ... _handbook/
http://forum.ubuntu.org.cn/viewtopic.ph ... highlight=


_________________
关注我的blog: ε==3


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-12-21 14:11 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
bones7456 写道:


非常感谢 bones7456 and aBiNg!

bones7456,你的手册写得非常好,我就是先看了你的手册才开始写这个脚本的,刚学着写,手很生:p
没想到提个问把作者给招来了,激动中……


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-12-21 14:25 

注册: 2007-05-22 10:48
帖子: 33
送出感谢: 0 次
接收感谢: 0 次
去掉while,文件名作参数输入,果然好了。
不过还有一个疑问,就是if那句,改成
Tstring[$1]>0 {print $0 >"add_temp"}
就报错了,为什么,不是挺符合pattern {action}的格式的吗?

引用:
#!/bin/bash

awk '
BEGIN {
FS="[ \t,]+"
while(getline<"file_1" >0) Tstring[$1]++
close("file_1")
}
{
if( Tstring[$1]>0 ) {print $0 >"add_temp"}#这里为什么必须用if?
}
' $


问完就找到答案了,因为if那句本身是在{}里面的,整个是一个action,如果改成下面这样,也是可以的。
引用:
#!/bin/bash

awk '
BEGIN {
FS="[ \t,]+"
while(getline<"file_1" >0) Tstring[$1]++
close("file_1")
}
if( Tstring[$1]>0 ) {print $0 >"add_temp"}
' $


谢谢楼上两位指点:)


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2007-12-21 15:42 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
DerekTan 写道:
bones7456 写道:


非常感谢 bones7456 and aBiNg!

bones7456,你的手册写得非常好,我就是先看了你的手册才开始写这个脚本的,刚学着写,手很生:p
没想到提个问把作者给招来了,激动中……


那个...我不是什么作者,嘿嘿,只是把简体中文版的格式稍作整理而已....顶多算个译者 :lol:


_________________
关注我的blog: ε==3


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 10 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译