免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: _lpq
打印 上一主题 下一主题

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

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


    hi jason 谢谢你解决了我的问题
我以为我可以解决我这个问题

但是发现我不能单纯的用awk -F,
1.
例如这句:
[104][14Jan16 12:13:51.500] [abc]  hgdf.350.1.djcn: cds-[cds:350-gsd] red cfd.350.1 cdf succed guass, cds3:sdj7

跟这个类似
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

因为我要的是从一个文件中通过查找到有guass的行,然后在截取cds3,且cds3不能只能获取一次
我自己是这样写的,
grep "guass" "${log_path}" | while read line
do
echo ${line} | cut -d, -f2 | cut -c2-9 >> "CN.csv"
sort -u "CN.csv"
done
要运行三秒,太慢了。。。

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
12 [报告]
发表于 2016-03-08 15:01 |只看该作者
回复 11# _lpq

问问题,基本三个重点
1. Input Data 输入数据

2. Procedure (程序)处理过程
  如果是程序出问题,别直接问程序出问题....
而是要让大家知道,我要让A(Input)变成B(Output)(或从A中取出B)
你没写"让A变成B(或从A中取出B)",你的程序得到C(正常,因为你的程序正常结果就会得到C)
一你直说有问题,有问题(你要得到B,但没写出来)----没人知道你要什么...

最好也把你这么做的用意是什么也写出来...
问者:要找XX路201号...(结果没这号)...
没人答 (没人知道XX路201号)
问者:买鞋,要去YYY店XX路201号...
答者:YYY店在XX路102号...(号错了)
答者:YYY店在WW路201号...(路错了)
答者:ZZ鞋店 档次高


3. Output Data 输出数据(期望结果)
    依"输入数据"及"处理过程",最后你要给出你期望结果...
   

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


        我错了。。。。
好,现在说下我遇到的问题
1. file
[104][14Jan16 12:13:51.500] [abc]  hgdf.343.1.djcn: cds-[cds:350-gsd] red cfd.350.1 cdf succed guass, cds3:sdj7
[104][14Jan16 12:13:54.500] [abc]  hgdf.350.1.djcn: cds-[cds:350-gsd] red cfd.350.1 cdf succed sef, cds3:sdj7
[104][14Jan16 12:13:51.546] [abc]  hgdf.365.1.djcn: cds-[cds:350-gsd] red cfd.350.1 cdf succed guass, cds3:sdj7
[104][14Jan16 12:13:12.500] [abc]  hgdf.231.1.djcn:
[104][14Jan16 12:13:51.500] [abc]  hgdf.789.1.djcn: cds-[cds:350-gsd] red
[104][14Jan16 12:13:51.234] [abc]  hgdf.390.1.djcn: cds-[cds:350-gsd] red cfd.350.1 cdf succed sef,fdr5:hyf6
[104][14Jan16 12:13:01.500] [abc]  hgdf.453.1.djcn: cds-[cds:350-gsd] red cfd.350.1 cdf succed
[104][14Jan16 12:13:23.500] [abc]  hgdf.350.1.djcn: cds-[cds:350-gsd] red cfd.350.1 cdf succed sef, cds3:sdj7
[104][14Jan16 12:13:65.500] [abc]  hgdf.645.1.djcn: cds-[cds:350-gsd] red cfd.350.1 cdf succed sef, fers3:654

因为我要的是从一个文件中通过查找到有sef的行,然后在截取cds3,且cds3只能获取一次

最后的结果:
cds3
fdr5
fers3

2.截取完之后能否把所有有sef的行删除呢?

thanks

论坛徽章:
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
14 [报告]
发表于 2016-03-09 09:21 |只看该作者
本帖最后由 jason680 于 2016-03-09 09:33 编辑

回复 13# _lpq


... cdf succed sef, cds3:sdj7
... cdf succed sef,fdr5:hyf6
... cdf succed sef, cds3:sdj7
... cdf succed sef, fers3:654

思路:
1. 找出共通点/固定格式
  sef,xxxx:
  注:可能有(半角)空格

2. 正则
  A  正则  xxxx ( : )  ==> [^:]+
    sef,xxxx:    ==>   sef,[^:]+:
  B 捕获 加 (....)
    sef,[^:]+:  ==>   sef,([^:]+):
  C   再加可有可无空格
    sef,([^:]+):    ==>  sef, *([^:]+):   


2. awk 去重
$ awk 'match($0,"sef, *([^:]+):",a){print a[1]}' file
cds3
fdr5
cds3
fers3

$ awk 'match($0,"sef, *([^:]+):",a){if(!d[a[1]]++)print a[1]}' file
cds3
fdr5
fers3

   

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


       hi,jason

我试了,但是报错。。。

报错为:     
gawk: cmd. line:1: fatal: match() cannot have 3 arguments

论坛徽章:
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
16 [报告]
发表于 2016-03-09 17:25 |只看该作者
回复 15# _lpq

awk version issue

$ awk --version
GNU Awk 3.1.8
Copyright (C) 1989, 1991-2010 Free Software Foundation.
....


$ awk -F'[,:]' '/sef/{k=$(NF-1);gsub(/^ +| +$/,"",k);if(!a[k]++)print k}' file
cds3
fdr5
fers3




   

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

谢谢~

那可以用sed弄出来吗?麻烦O(∩_∩)O哈!
   

论坛徽章:
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
18 [报告]
发表于 2016-03-10 09:25 |只看该作者
回复 17# _lpq

sorry, I can't using sed to solve this issue.

but, there is easy way to solve it by perl, as below:

$ perl -lane '{if(m/sef, *([^:]+):/){if(!$h{$1}++){print$1}}}' file
cds3
fdr5
fers3


Note: it's good enough for Unix like OS, ex: AIX, Solaris, ...   

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


thank you ~

  因为去医院拔了智齿一直没上论坛,

谢谢你一直帮助我!

   

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


    回复 18# jason680

hi,jason

请教一下,将第三列和第四列相比较,如果第三列与第四列相等,则把第四列赋值为空
file:
d,g,j,l,l
s,f,o,o,l
z,r,y,j,k
d,v,n,n,r
q,f,h,k,j
a,f,j,j,o
s,f,y,i,e

结果

d,g,j,l,l
s,f,o,l
z,r,y,j,k
d,v,n,,r
q,f,h,k,j
a,f,j,,o
s,f,y,i,e

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP