Chinaunix
标题:
怎么不获取(或跳过)重复的字符串
[打印本页]
作者:
_lpq
时间:
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
现在我要的是如果第二列,关键字假如有多个重复的,我只要第一次出现的,如果出现了下一次则不获取(或跳过)这个关键字
作者:
sync_1521
时间:
2016-03-07 09:34
假如你处理关键字的命令是ls -l
awk -F, '!a[$2]++{CMD="ls -l "$2;system(CMD)}' file
作者:
_lpq
时间:
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
这样子,谢谢~
作者:
关阴月飞
时间:
2016-03-07 11:39
回复
3#
_lpq
目测一下:
awk -F, '!a[$2]++{print $4}' urfile
复制代码
作者:
_lpq
时间:
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
谢谢啦~~
作者:
_lpq
时间:
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
谢谢啦~~
作者:
jason680
时间:
2016-03-07 16:49
回复
5#
_lpq
$ awk -F, '$2=="f"{if(!a[$4]++)print$4}' file
k
r
i
作者:
_lpq
时间:
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的问题是否还有速度更快的解决办法
终于可以与大神对话了,嘿嘿
作者:
jason680
时间:
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
作者:
_lpq
时间:
2016-03-07 21:51
回复
9#
jason680
非常感谢~~~
作者:
_lpq
时间:
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.那查找的行提取信息随后删除呢?
谢谢哈~
作者:
jason680
时间:
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 输出数据(期望结果)
依"输入数据"及"处理过程",最后你要给出你期望结果...
作者:
_lpq
时间:
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
作者:
jason680
时间:
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
作者:
_lpq
时间:
2016-03-09 16:24
回复
14#
jason680
hi,jason
我试了,但是报错。。。
报错为:
gawk: cmd. line:1: fatal: match() cannot have 3 arguments
作者:
jason680
时间:
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
作者:
_lpq
时间:
2016-03-09 17:56
回复
16#
jason680
谢谢~
那可以用sed弄出来吗?麻烦O(∩_∩)O哈!
作者:
jason680
时间:
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, ...
作者:
_lpq
时间:
2016-03-12 16:14
回复
18#
jason680
thank you ~
因为去医院拔了智齿一直没上论坛,
谢谢你一直帮助我!
作者:
_lpq
时间:
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
作者:
_lpq
时间:
2016-03-14 13:35
回复
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
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2