免费注册 查看新帖 |

Chinaunix

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

一个awk处理文本问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-30 15:21 |只看该作者 |倒序浏览
有一截选文本如下:
0  222  a
1  222  a
2  222  a
3  333  a
4  444  a
5  333  a
6  777  b
7  333  b
8  222  b
要求用awk实现:
第二个字段相同并且第三字段不同的两条记录不输出(注意是两条)

结果文件应该为:
1  222  a
2  222  a
4  444  a
5  333  a
6  777  b

请各位大侠帮助! 不胜感谢!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-12-30 15:41 |只看该作者

一个awk处理文本问题

[quote]原帖由 "tianci3982730"]不明白[/quote 发表:

论坛徽章:
0
3 [报告]
发表于 2004-12-30 15:56 |只看该作者

一个awk处理文本问题

不好意思,我表达的不好!
我的意思是符合条件的不用输出,其他的输出
我给的数据例子中 0 222 a和8 222 b这两行符合条件就不输出这两行了
3 333 a和7 333 b这两行也符合条件也不用输出了
其他的输出

也就是从文件中成队地删除掉符合条件的两条记录

论坛徽章:
0
4 [报告]
发表于 2004-12-30 15:58 |只看该作者

一个awk处理文本问题

不好意思,打了错别字,"也就是从文件中成队地删除掉符合条件的两条记录 "
中的"成队"应该是"成对"

论坛徽章:
0
5 [报告]
发表于 2004-12-30 17:04 |只看该作者

一个awk处理文本问题

笨笨的写一个

  1. [kennyyu@haha dataDir]$ more a.txt
  2. 0 222 a
  3. 1 222 a
  4. 2 222 a
  5. 3 333 a
  6. 4 444 a
  7. 5 333 a
  8. 6 777 b
  9. 7 333 b
  10. 8 222 b
复制代码


  1. [kennyyu@haha dataDir]$ more deal.awk
  2. #! /bin/awk -f

  3. {i++;a[i]=$0} \
  4. END{ \
  5. for(j=1;j<=i;j++) \
  6. { \
  7.         if(a[j]=="") continue; \
  8.         split(a[j],aArry," "); \
  9.         for(k=1;k<=i;k++) \
  10.         { \
  11.                 split(a[k],bArry," "); \
  12.                 if(aArry[2]==bArry[2]&&aArry[3]!=bArry[3]) \
  13.                 {a[j]="";a[k]="";break}\
  14.         } \
  15. }; \
  16. for (t=0;t<=i;t++) if(a[t]!="") print a[t]
  17. }

复制代码

运行:

  1. [kennyyu@haha dataDir]$ ./deal.awk a.txt
  2. 1 222 a
  3. 2 222 a
  4. 4 444 a
  5. 5 333 a
  6. 6 777 b
复制代码


OS: RH linux 9.0
GNU Awk 3.1.1

论坛徽章:
0
6 [报告]
发表于 2004-12-30 23:19 |只看该作者

一个awk处理文本问题

好呀好呀
我终于知道熟练的用途了!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2004-12-31 10:15 |只看该作者

一个awk处理文本问题

不明白  

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-12-31 10:20 |只看该作者

一个awk处理文本问题

不知道对不对,望大家指教

算了,还是不明白题意

论坛徽章:
0
9 [报告]
发表于 2004-12-31 10:27 |只看该作者

一个awk处理文本问题

多谢guangzongy!!!!
另外我想问一下,unix中的数组用数字做下标是不是最大只可以1024???
如果不是,最大可以达到多少呢???

论坛徽章:
0
10 [报告]
发表于 2004-12-31 11:43 |只看该作者

一个awk处理文本问题

原帖由 "三剑侠客" 发表:
多谢guangzongy!!!!
另外我想问一下,unix中的数组用数字做下标是不是最大只可以1024???
如果不是,最大可以达到多少呢???

?为什么这么问!难道我给的代码在记录数过大时出错了?
,给你一个测试的代码,看看awk有没有对数组下标作限制?有的话是多大?   
呵呵,你要是有什么心得要告诉我哟
  1. echo '' | awk '{for(i=0;i<=50000;i++) {a[i]=i;print "a["i"]="a[i]}}'
复制代码

50000标明的数字换成你期望的最大数字就好了!
不过我发现下面这个例子应该说明了一个问题——数组的位置标记并不一定需要数字,它的存储更像键对的形式。
  1. echo '' | awk '{a["abc"]="jj";print "a[abc]="a["abc"]}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP