awk脚本错误

sh/bash/dash/ksh/zsh等Shell脚本
回复
DerekTan
帖子: 33
注册时间: 2007-05-22 10:48
联系:

awk脚本错误

#1

帖子 DerekTan » 2007-12-21 10:50

我要做的是找出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"}#错误就在这里
}
' $
谢谢。
aBiNg
帖子: 1331
注册时间: 2006-07-09 12:22
来自: 南京

#2

帖子 aBiNg » 2007-12-21 11:32

代码: 全选

while(getline<"file_2" >0) {
if( Tstring[$1]>0 ) {
print $0 >"add_temp"
}
}
貌似你的body没有大括号
DerekTan
帖子: 33
注册时间: 2007-05-22 10:48
联系:

#3

帖子 DerekTan » 2007-12-21 11:36

hello aBiNg, 我加了大括号以后还是不正确。
Thank you for your help. :)
aBiNg
帖子: 1331
注册时间: 2006-07-09 12:22
来自: 南京

#4

帖子 aBiNg » 2007-12-21 12:16

你举个例子吧,开始的BEGIN也许有问题,上面的while的body也没有大括号。
DerekTan
帖子: 33
注册时间: 2007-05-22 10:48
联系:

#5

帖子 DerekTan » 2007-12-21 12:52

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:)
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#6

帖子 bones7456 » 2007-12-21 13:05

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
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#7

帖子 bones7456 » 2007-12-21 13:08

关注我的blog: ε==3
DerekTan
帖子: 33
注册时间: 2007-05-22 10:48
联系:

#8

帖子 DerekTan » 2007-12-21 14:11

非常感谢 bones7456 and aBiNg!

bones7456,你的手册写得非常好,我就是先看了你的手册才开始写这个脚本的,刚学着写,手很生:p
没想到提个问把作者给招来了,激动中……
DerekTan
帖子: 33
注册时间: 2007-05-22 10:48
联系:

#9

帖子 DerekTan » 2007-12-21 14:25

去掉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"}
' $
谢谢楼上两位指点:)
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#10

帖子 bones7456 » 2007-12-21 15:42

DerekTan 写了:
非常感谢 bones7456 and aBiNg!

bones7456,你的手册写得非常好,我就是先看了你的手册才开始写这个脚本的,刚学着写,手很生:p
没想到提个问把作者给招来了,激动中……
那个...我不是什么作者,嘿嘿,只是把简体中文版的格式稍作整理而已....顶多算个译者 :lol:
关注我的blog: ε==3
回复