LinuxSir.cn,穿越时空的Linuxsir!

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

这个循环语句为什么不能工作?

[复制链接]
发表于 2009-9-22 11:44:12 | 显示全部楼层 |阅读模式
文件a:
78
88

文件b:
22        2        767
59        88        773
3        332        99
12        78        111

下面这个语句为什么没有输出?
for i in `cat a`;do awk '$2=="$i" {print $0}' b;done
发表于 2009-9-22 12:15:17 | 显示全部楼层
2个错误吧
首先awk导入外部变量 的时候就错了, 单引号里面$i是什么?
忘了双引号行不行了, 用-v 倒腾以下肯定行。

其次 你在for嵌套了一个awk,看不明白。循环嵌套一个循环? 在这里有什么用?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-22 12:41:41 | 显示全部楼层
那条awk语句不是循环吧。
我是想将b文件中 第2个域匹配a文件的行 的所有行打印出来,有没有好方法?
回复 支持 反对

使用道具 举报

发表于 2009-9-22 13:45:16 | 显示全部楼层
单引号的问题,因为你想做替换$i而这个替换.
用下面的就可以了
for i in `cat a`;do awk '$2=='$i'{print $0}' b ;done
另外你在nt $0}' b ;之间好像少输入一个空格
回复 支持 反对

使用道具 举报

发表于 2009-9-22 15:39:19 | 显示全部楼层
Post by markuz;2029124
那条awk语句不是循环吧。
我是想将b文件中 第2个域匹配a文件的行 的所有行打印出来,有没有好方法?

awk其实就是一个循环。
你可以这样处理这个问题, 在awk中直接完成
awk 'NR==FNR{a[$1]}NR>FNR{if($2 in a)print}' a.txt b.txt

补充1:
如果非要用循环的话可以
while read line
do
        awk -v tmp=$line '$2==tmp{print}' f24_2.data

done < f24_1.data
但是我觉得效率不高,不如awk效率好
devil@devil-desktop:~/bash/lx$ time bash f24.sh
12 78 111
59 88 773

real        0m0.018s
user        0m0.004s
sys        0m0.008s


devil@devil-desktop:~/bash/lx$ time awk 'NR==FNR{a[$1]}NR>FNR{if($2 in a)print}' f24_1.data f24_2.data
59 88 773
12 78 111

real        0m0.004s
user        0m0.000s
sys        0m0.000s
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-22 21:09:32 | 显示全部楼层
后来才知道问题出在awk引用外部变量。
非常感谢楼上两位特别是overawe的解答:)
回复 支持 反对

使用道具 举报

发表于 2009-9-23 11:15:50 | 显示全部楼层
有更简单的方法!!
for i in `cat a`;do grep $i b | awk {'print $0'};done
回复 支持 反对

使用道具 举报

发表于 2009-9-23 18:35:28 | 显示全部楼层
Post by wonleing;2029390
有更简单的方法!!
for i in `cat a`;do grep $i b | awk {'print $0'};done


效率最低的方法
回复 支持 反对

使用道具 举报

发表于 2009-9-23 19:54:07 | 显示全部楼层
Post by lastart;2029548
效率最低的方法

=。=! 好奇试了一下
devil@devil-desktop:~/bash/lx$ time for i in `cat f24_1.data`;do grep $i f24_2.data | awk {'print $0'};done
12 78 111
59 88 773

real        0m0.026s
user        0m0.008s
sys        0m0.008s

果真如此
另外用grep定位这里没问题,但是不够严谨。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-24 09:56:12 | 显示全部楼层
Post by wonleing;2029390
有更简单的方法!!
for i in `cat a`;do grep $i b | awk {'print $0'};done


grep不能定位到域,如果其他域也匹配a中的行,得到的结果肯定不是想要的。另外,grep 后面还有用awk打印的必要吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

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