免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3490 | 回复: 2
打印 上一主题 下一主题

awk的getline指针能否重置? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-01 16:07 |只看该作者 |倒序浏览
本帖最后由 dickgz1z 于 2010-07-01 17:46 编辑
  1. awk -F"," '{
  2. print $3;
  3. while(getline d <"test"){
  4. split(d,k,",");
  5. print k[1]">>>>>"k[2];
  6. if(match($3,k[1]))count[k[2]]++;
  7.    }
  8. }END{
  9. for(i in count)print i"\t"count[i]
  10. }' test2
复制代码
test:
bb.*kk.*ll,p
BB.*nn.*mm,l
cc.*mm.*ll,c
CC.*nn.*mm,t

test2:
aaaa,bbbb,aaaabbbbbkkkkkkllllll
bbbb,nnnn,aaaaBBBBBnnnnnnmmmmmm
cccc,mmmm,aaaaccccckkmmkkllllll
vvvv,xxxx,aaaaCCCCCnnnnnnmmmmmm
aaaa,bbbb,aaaabbbbbkkkkkkllllll

输出:
aaaabbbbbkkkkkkllllll
bb.*kk.*ll>>>>>p
BB.*nn.*mm>>>>>l
cc.*mm.*ll>>>>>c
CC.*nn.*mm>>>>>t

aaaaBBBBBnnnnnnmmmmmm
aaaaccccckkkkkkllllll
aaaaCCCCCnnnnnnmmmmmm
p       1

我想在awk扫描test2的第三个域$3的时候,从test中去匹配其第一个域,匹配到的话就获取其第二个域的值,以此作为count数组的索引,然后将相应的count[k[2]]++,计算匹配到的test2的次数。想象中的输出应该是:
l       1
c       1
p       2
t       1
但是从打印信息可以看到,在扫描test2第一行时,进入while循环,getline,读一次已将指针直到文件末尾,到扫描第二行时,getline返回的值已为0,无法再进入while循环读取test文件。
怎样才能在扫描test2每一行的同时扫描test?

答案1:
  1. awk -F',' '
  2. NR==FNR{
  3. a[$1]=$2;next
  4.   }
  5. NR>FNR{
  6. for(cnt in a)
  7. if($3~cnt){
  8. count[a[cnt]]++;break;
  9.   }
  10. }END{
  11. for(cnt in count)print cnt"\t"count[cnt]
  12. }' test test2
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-07-01 16:29 |只看该作者
  1. awk -F ',' 'NR==FNR{patt[NR]=$1;res[NR]=$2" 0";next}{for(cnt in patt)if($0~patt[cnt]){split(res[FNR],tmp," ");tmp[2]++;res[FNR]=tmp[1]" "tmp[2];break}}END{for(cnt in res)print res[cnt]}' test1 test2
复制代码

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
3 [报告]
发表于 2010-07-01 18:30 |只看该作者
while外面加一个 close("test")
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP