免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 3179 | 回复: 20
打印 上一主题 下一主题

[文本处理] 怎么不获取(或跳过)重复的字符串 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之广夏
日期:2016-04-12 15:53:16
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-07 09:14 |只看该作者 |倒序浏览
各位大神,求助!!!
一个文件file:
d,g,j,l,l
s,f,h,k,l
z,r,y,j,k
d,v,n,k,r
a,f,j,r,o
s,f,y,i,e

我要通过读行,获取第二列的关键字,然后通过这个关键字去处理文件,while read line

现在我要的是如果第二列,关键字假如有多个重复的,我只要第一次出现的,如果出现了下一次则不获取(或跳过)这个关键字




论坛徽章:
12
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00程序设计版块每日发帖之星
日期:2016-01-19 06:20:0015-16赛季CBA联赛之江苏
日期:2016-01-17 15:31:3915-16赛季CBA联赛之上海
日期:2016-01-16 15:44:3015-16赛季CBA联赛之浙江
日期:2016-01-15 20:38:1815-16赛季CBA联赛之北京
日期:2016-01-09 14:30:15CU十四周年纪念徽章
日期:2016-01-07 12:31:5115-16赛季CBA联赛之四川
日期:2016-01-01 11:49:1515-16赛季CBA联赛之深圳
日期:2015-12-24 14:23:4115-16赛季CBA联赛之山西
日期:2015-12-15 16:22:31技术图书徽章
日期:2015-12-10 17:41:0015-16赛季CBA联赛之北控
日期:2016-02-03 10:03:24
2 [报告]
发表于 2016-03-07 09:34 |只看该作者
假如你处理关键字的命令是ls -l
awk -F, '!a[$2]++{CMD="ls -l "$2;system(CMD)}' file

论坛徽章:
1
15-16赛季CBA联赛之广夏
日期:2016-04-12 15:53:16
3 [报告]
发表于 2016-03-07 10:37 |只看该作者
回复 2# sync_1521


    谢谢大神,
但是 ,额。。新手
我是对文件经行处理,获取每行有f关键字的第4个域
通过grep “关键字f” 查找到那一行,假如那一行是 s,f,h,k,l
然后对那行进行处理cut 获取关键字 k
然后获取k在文件中的所有相关的信息

我上面的file可能不全,我再整理下哈~

d,g,j,l,l
s,f,h,k,l
z,r,y,j,k
d,v,n,k,r
s,f,h,k,j 这一行为f和k都在上一行的同一个位置,因为在在上一行中已经获取了k这个关键字,所以这个k就不获取(或跳过)
a,f,j,r,o
s,f,y,i,e

这样子,谢谢~

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
4 [报告]
发表于 2016-03-07 11:39 |只看该作者
回复 3# _lpq

目测一下:
  1. awk -F, '!a[$2]++{print $4}'  urfile
复制代码

论坛徽章:
1
15-16赛季CBA联赛之广夏
日期:2016-04-12 15:53:16
5 [报告]
发表于 2016-03-07 15:33 |只看该作者
回复 4# 关阴月飞


    试过了,可以把第四列打印出来,但是我要的结果是不打印第四列重复的
第四列有三个k
我只要第一个就可以了


d,g,j,l,l
s,f,o,k,l
z,r,y,j,k
d,v,n,k,r
q,f,h,k,j 这一行为f和k都在上一行的同一个位置,因为在在上一行中已经获取了k这个关键字,所以这个k就不获取(或跳过)
a,f,j,r,o
s,f,y,i,e


我需要的结果是
k
r
i

谢谢啦~~

论坛徽章:
1
15-16赛季CBA联赛之广夏
日期:2016-04-12 15:53:16
6 [报告]
发表于 2016-03-07 16:46 |只看该作者
回复 5# _lpq


    看着不清~~~
重新写一遍

    试过了,可以把第四列打印出来,但是我要的结果是不打印第四列重复的
第四列有三个k
我只要第一个就可以了


d,g,j,l,l
s,f,o,k,l
z,r,y,j,k
d,v,n,k,r
q,f,h,k,j 这一行为f和k都在上一行的同一个位置,因为在在上一行中已经获取了k这个关键字,所以这个k就不获取(或跳过)
a,f,j,r,o
s,f,y,i,e


我需要的结果是
k
r
i

谢谢啦~~

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
7 [报告]
发表于 2016-03-07 16:49 |只看该作者
回复 5# _lpq

$ awk -F, '$2=="f"{if(!a[$4]++)print$4}' file
k
r
i

   

论坛徽章:
1
15-16赛季CBA联赛之广夏
日期:2016-04-12 15:53:16
8 [报告]
发表于 2016-03-07 17:22 |只看该作者
回复 7# jason680


   
    谢谢iason

1.  因为我要处理的文件比较大

然后是
grep "f" | cut -d" " -f4  与  awk -F, '$2=="f"{if(!a[$4]++)print$4}' file
就是同样的结果    这两者相比较哪个速度更快,


2.
awk '$0 ~/(Yellow|Brown)/' grade.txt

为抽取级别为y e l l o w或b r o w n的记录,使用竖线符|。意为匹配| 两边模式之一。

然后我想再加一个匹配Green
不知是否可以
awk '$0 ~/(Yellow|Brown|Green)/' grade.txt

3.

对于2的问题是否还有速度更快的解决办法


终于可以与大神对话了,嘿嘿

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
9 [报告]
发表于 2016-03-07 17:59 |只看该作者
1. ...哪个速度更快...
  不一定,但少用管道...
  grep "f" file | cut -d" " -f4  
  awk -F, '$2=="f"{if(!a[$4]++)print$4}' file
注:上面两者(功能)作用不同...
有时结果相同,但有时结果不同...

2&3. ...不知是否可以 awk '$0 ~/(Yellow|Brown|Green)/' grade.txt
可以
  awk '/Yellow|Brown|Green/' grade.txt
  grep -E 'Yellow|Brown|Green' grade.txt

time 可以帮助你,了解何者较快/慢(要多测几次)...
time awk ...
time grep ...

$ time awk  '/99999|11234|65432/' file
11234
65432
99999

--------------------
$ seq 100000 > file

$ time grep -E '99999|11234|65432' file
1. real    0m0.111s
2. real    0m0.099s
3. real    0m0.102s

$ time awk  '/99999|11234|65432/' file
1. real    0m0.146s
2. real    0m0.099s
3. real    0m0.126s

论坛徽章:
1
15-16赛季CBA联赛之广夏
日期:2016-04-12 15:53:16
10 [报告]
发表于 2016-03-07 21:51 |只看该作者
回复 9# jason680


    非常感谢~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP