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
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
wk '{if(++a[$2]==1) print $1,$3,$4,$8}' file
qq ww dd yyy
qq ww dd yyy
qq ww dd yyy
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