免费注册 查看新帖 |

Chinaunix

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

求助 如何提取这样的行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-28 16:55 |只看该作者 |倒序浏览
我有文本是这样的:

    a     b      c    d        e         f        g      h     i       j

    1:1000:342:fd:5555:4564:0:131:BBB:0
     1:AAA:2:236:55fdas:4fdsa4:0:131:0:0
     1:1fdsa0:2:236:5fd5:45fda4:0:131:AAA:0
     1:BBB:2:236:55df5:45q14:0:131:Cff:0
     1:Bcc:2:236:55df5:45q14:0:131:Caa:0
     1:AAA:2:2df:55df5:45fd:0:131:CCC:0

先查找第 i 列不为零的数据,然后与每行的第 b 列对比,如果相同,则把相同行都提取出来
   例如上面提取结果为:
1:1000:342:fd:5555:4564:0:131:BBB:0
1:BBB:2:236:55df5:45q14:0:131:CCC:0

1:1fdsa0:2:236:5fd5:45fda4:0:131:AAA:0
1:AAA:2:236:55fdas:4fdsa4:0:131:0:0
1:AAA:2:2df:55df5:45fd:0:131:CCC:0
     

谢谢了!!!

论坛徽章:
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
2 [报告]
发表于 2008-01-28 17:25 |只看该作者
  1. awk -F: 'NR==FNR&&$9!=0{a[$9]=$0}NR>FNR&&($2 in a){print;b[$2]++}END{for(i in b) print a[i]}' urfile urfile
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-01-28 17:50 |只看该作者
报错了,提示:
awk:语法错误 在第 1 行附近
awk:语法错误 在第 1 行附近
awk:语法错误 在第 1 行附近
awk:漏出 在第 1 行附近

论坛徽章:
0
4 [报告]
发表于 2008-01-28 18:02 |只看该作者
呵呵,我写的比较繁复,不太好,
楼主注意你的源数据文件中的中文逗号要替换成英文的
  1. #!/bin/awk -f                                                                                                                                                
  2.                                                                                                                                                               
  3. { data[NR] = $0 }                                                                                                                                             
  4.                                                                                                                                                               
  5. END {                                                                                                                                                         
  6.   for (i in data) {                                                                                                                                          
  7.     split(data[i], line1, ":")                                                                                                                                
  8.     if (line1[9] == "" || line1[9] == "0")                                                                                                                    
  9.       continue;                                                                                                                                               
  10.                                                                                                                                                               
  11.     k = 0;                                                                                                                                                   
  12.     for (j in data) {                                                                                                                                         
  13.       split(data[j], line2, ":");                                                                                                                             
  14.       if (line2[2] == line1[9])                                                                                                                              
  15.         out[k++] = data[j];                                                                                                                                   
  16.     }                                                                                                                                                         
  17.     if (k == 0)                                                                                                                                               
  18.       continue;                                                                                                                                               
  19.                                                                                                                                                               
  20.     print data[i];                                                                                                                                            
  21.     for (m=0; m<k; m++)                                                                                                                                       
  22.       print out[m];                                                                                                                                          
  23.     print "";                                                                                                                                                
  24.   }                                                                                                                                                           
  25. }
复制代码
  1. ~$ ./test.awk datafile
  2. 1:1fdsa0:2:236:5fd5:45fda4:0:131:AAA:0
  3. 1:AAA:2:236:55fdas:4fdsa4:0:131:0:0
  4. 1:AAA:2:2df:55df5:45fd:0:131:CCC:0

  5. 1:1000:342:fd:5555:4564:0:131:BBB:0
  6. 1:BBB:2:236:55df5:45q14:0:131:Cff:0
复制代码

论坛徽章:
0
5 [报告]
发表于 2008-01-28 19:55 |只看该作者
原帖由 seeLnd 于 2008-1-28 18:02 发表
呵呵,我写的比较繁复,不太好,
楼主注意你的源数据文件中的中文逗号要替换成英文的
#!/bin/awk -f                                                                                                     ...


非常感谢

论坛徽章:
0
6 [报告]
发表于 2008-01-29 09:00 |只看该作者
原帖由 ly5066113 于 2008-1-28 17:25 发表
awk -F: 'NR==FNR&&$9!=0{a[$9]=$0}NR>FNR&&($2 in a){print;b[$2]++}END{for(i in b) print a}' urfile urfile

如果i列会重复的话,这个就会有问题了
不知道ly兄对此是否考虑过?

论坛徽章:
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
7 [报告]
发表于 2008-01-29 09:48 |只看该作者
原帖由 jinl 于 2008-1-29 09:00 发表

如果i列会重复的话,这个就会有问题了
不知道ly兄对此是否考虑过?

原帖由 flw 于 2007-3-20 09:38 发表

UNIX 编程艺术上讲到,不要过早地优化你的程序。简单的思路往往就是最快的,或者已经能够满足你的需求。


我觉得很有道理,我只是根据楼主给出的文本进行编辑,多余的我不会考虑。

论坛徽章:
0
8 [报告]
发表于 2008-01-29 10:06 |只看该作者
唉~~楞没看懂 题目
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP