Chinaunix

标题: 匹配每行的第二列,只输出第一次匹配行 [打印本页]

作者: volwang    时间: 2015-02-13 12:37
标题: 匹配每行的第二列,只输出第一次匹配行
本帖最后由 volwang 于 2015-02-13 12:40 编辑

已知文本:
qq sss.1  ww dd  rr  ee  tt yyy  
qq sss.1  wr  dt  tr  ye  qt yxy
qq sss.2  ww dd  rr  ee  tt yyy
qq sss.3  ww dd  rr  ey  tt yyy
qq sss.3  ww dd  rr  ee  tt yyy
qq sss.1  ww dd  rr  ee  tt yyy  
qq sss.1  ww dr  er  te  wt yyy  
qq sss.x1  ww dr  ur  te  wt yyy
qq sss.x1  ww dr  er  te  wt yyy
当第二列字符相同时,只输出第一次出现的列,后面重复出现的删除。
上述文本只输出第1,3,4,8列,第2,5,6,7,9列不输出。
结果:
qq sss.1  ww dd  rr  ee  tt yyy  
qq sss.2  ww dd  rr  ee  tt yyy
qq sss.3  ww dd  rr  ey  tt yyy
qq sss.x1  ww dr  ur  te  wt yyy

谢谢
作者: ly5066113    时间: 2015-02-13 12:57
回复 1# volwang
  1. awk '!a[$2]++' file
复制代码

作者: volwang    时间: 2015-02-13 17:13
这个文本有25万行。用你这行代码只能处理一部分。
作者: volwang    时间: 2015-02-13 17:13
这个文本有25万行。用你这行代码只能处理一部分。
作者: volwang    时间: 2015-02-13 17:13
不能充分匹配。
作者: zxy877298415    时间: 2015-02-13 18:32
  1. wk '{if(++a[$2]==1) print $1,$3,$4,$8}' file
  2. qq ww dd yyy
  3. qq ww dd yyy
  4. qq ww dd yyy
  5. qq ww dr yyy
复制代码
回复 5# volwang


   
作者: zooyo    时间: 2015-02-13 18:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: zxy877298415    时间: 2015-02-13 21:57
回复 7# zooyo


   
作者: dn833    时间: 2015-02-13 23:39
找个较大内存的机器,把文件放到/dev/shm下再试试看
作者: blackold    时间: 2015-02-14 09:43
回复 4# volwang


    25万行不成问题吧。
作者: yyt030    时间: 2015-02-15 12:31
回复 4# volwang


    量大有啥区别?这个解决很完美啊!
作者: volwang    时间: 2015-02-16 18:27
本帖最后由 volwang 于 2015-02-16 18:32 编辑

文本有20万行。
akw只处理一部分文本就退出。awk没有处理全部文本。

回复 11# yyt030


   
作者: Herowinter    时间: 2015-02-16 18:48
回复 12# volwang

1楼的数据和你的真实数据差距很大?
否则25W行好像可以处理啊。。。
   
作者: volwang    时间: 2015-02-16 18:52
稍微有点差距。20w行,8列。
awk处理一部分。
20w行中第二列中有不少重复的。需要输出第一个,后续相同的不输出。

回复 13# Herowinter


   
作者: volwang    时间: 2015-02-16 19:01
你好。过节好。
awk我试过了,少量行可以处理,行20万就不行了。
如果我把这个文件命为log,用for循环遍历每一行第二列。
第一次出现的写到log2中,后续循环中,判断log2中是否含有相同字符,无则输出到log2。
不知道这样可行?
最后得到log2,则为输出。

回复 13# Herowinter


   

作者: volwang    时间: 2015-02-16 19:36
原输入文件为log;输出文件为log2。

rm -rf log2
touch log2
for i in `cat log |awk '{print $2 }' `
do
aa=`cat log2 | grep $i `
if  [ ! -z "$aa" ] ; then
echo "have"
else
cat log |grep $i |head -1 >> log2
fi
done

这样可否

回复 13# Herowinter


   
作者: KoomIer    时间: 2015-02-17 11:09
用python建立一个数组,然后try一下就好了
没有就输出,有就忽略


回复 1# volwang


   
作者: jason680    时间: 2015-02-17 15:18
回复 14# volwang

Try this way if your awk can't work properly

$ perl -lane '{print if(!$h{$F[1]}++)}' FILE
qq sss.1  ww dd  rr  ee  tt yyy  
qq sss.2  ww dd  rr  ee  tt yyy
qq sss.3  ww dd  rr  ey  tt yyy
qq sss.x1  ww dr  ur  te  wt yyy


作者: zongyaotang    时间: 2015-02-27 15:43
先把第二列重复的字符串找出来
然后对每个这样的字符串找出其行号
如果能找出所有非第一次出现的行号
删去这些行即可





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2