Chinaunix

标题: 如何去除具有相同字段的行 [打印本页]

作者: luck_libiao    时间: 2010-06-04 10:40
标题: 如何去除具有相同字段的行
如下:

54887635|20100603123023|20370101000000|DG000000000038226127|
54887635|20100130175345|20370101000000|DG000000000038226127|


现在目的是去除第一个字段相同的行,上面列举的是相同的行,其中该文件涉及1000万行数据,目的是通过第一个字段进行过滤,去除第一个字段相同的行,麻烦各位兄弟给看看!在线等待!
作者: iori809    时间: 2010-06-04 10:48
回复 1# luck_libiao


    在给多点数据行吗?然后再给出你的需求
这样可以节省大家的时间,要不还得猜你的意思
作者: luck_libiao    时间: 2010-06-04 10:56
回复 1# luck_libiao


    比如数据如下:
24000044|20080101000000|20370101000000|DG000000000032378684|
54000100|20091228171801|20370101000000|DG000000000037871181|
24000045|20080101000000|20370101000000|DG000000000032379995|
54000101|20091228171801|20370101000000|DG000000000037871193|
24000046|20080101000000|20370101000000|DG000000000032379776|
24000047|20080101000000|20370101000000|DG000000000032380012|
54000103|20091228171804|20370101000000|DG000000000037871232|
54000105|20091228171819|20370101000000|DG000000000037871213|
24000050|20080101000000|20370101000000|DG000000000032398894|
54000106|20091228171819|20370101000000|DG000000000037871209|
54887635|20100603123023|20370101000000|DG000000000038226127|
54887635|20100130175345|20370101000000|DG000000000038226127|

其中删除重复字段出现的行,其实这些数据都是内存库中的数据,将内存库的数据导出后生成cbe_subscriber.unl文件,
实现的结果犹如:
select distinct(subscriberkey) from cbe_subscriber 注:第一个字段即:subscriberkey
但是由于已经导成文件了,并且内存库中,无法进行去重复字段的行,所以需要用脚本来实现,麻烦兄弟们看下!
作者: aluoyeshi    时间: 2010-06-04 10:57
awk -F"|" '!a[$1]++' file
作者: liaosnet    时间: 2010-06-04 10:58
awk -F'|' '! a[$1]++' ufile           

这个都是周经了..
作者: luck_libiao    时间: 2010-06-04 11:03
回复 4# aluoyeshi


    我先试下!
作者: iori809    时间: 2010-06-04 11:05
回复 3# luck_libiao


    3楼和4楼不是你的意思吧?我现在看总决赛呢~ 等会儿吧呵呵
作者: lkk2003rty    时间: 2010-06-04 11:06
如果第一个字段都是8位的话
  1. uniq -u -w 8 file
复制代码

作者: iori809    时间: 2010-06-04 11:10
回复 8# lkk2003rty


    没错~你的还是LZ要的
作者: rainbird2    时间: 2010-06-04 11:21
sort -u -n file
作者: expert1    时间: 2010-06-04 11:36
绿衫军应该输了吧。?
作者: luck_libiao    时间: 2010-06-04 11:42
回复 8# lkk2003rty


    位数肯定是不固定的呀!因为涉及几个表数据
作者: luck_libiao    时间: 2010-06-04 11:43
回复 1# luck_libiao


    3楼和4楼的执行结果貌似是正确的,因为确实做到了去除重复字段的行!还有待验证!
作者: expert1    时间: 2010-06-04 12:11
3,4F按照你的陈述的要求,肯定是正确的了。不是貌似正确
作者: lkk2003rty    时间: 2010-06-04 13:01
回复 14# expert1


    以3楼数据为例
4楼的
会把
54887635|20100603123023|20370101000000|DG000000000038226127|
54887635|20100130175345|20370101000000|DG000000000038226127|
这样的取一行打印出来的。。。。。。。。。。
作者: Shell_HAT    时间: 2010-06-04 13:06
以3楼的数据为例,黑体的那两行都删除?还是只删除其中一行?
作者: Shell_HAT    时间: 2010-06-04 13:09
回复 8# lkk2003rty


如果重复行不相邻,uniq就不好使了吧。
作者: ywlscpl    时间: 2010-06-04 13:15
现在目的是去除第一个字段相同的行,上面列举的是相同的行,其中该文件涉及1000万行数据,目的是通过第一个字段进行过滤,去除第一个字段相同的行,麻烦各位兄弟给看看!在线等待!
实现的结果犹如:
select distinct(subscriberkey) from cbe_subscriber 注:第一个字段即:subscriberkey


后者也就是awk -F '|' '!a[$1]++' 应该是楼主你想要的
给楼主个建议,尽量把问题描述准确
作者: lkk2003rty    时间: 2010-06-04 13:29
本帖最后由 lkk2003rty 于 2010-06-04 13:31 编辑
  1. sort -t"|" file | awk -F"|" '{all=$0;fst=$1;a=0;while(1){while((stat=getline) > 0){if(fst != $1)break; a=1}if(a==0){print all;all=$0;fst=$1} else {if(stat>0){all=$0;fst=$1}}if(stat<=0) exit;a=0;}}'
复制代码
重复的都删除的。。。。
作者: lkk2003rty    时间: 2010-06-04 13:30
回复 17# Shell_HAT


    恩,那就先用sort处理下再管道就行了。。。。
作者: ywlscpl    时间: 2010-06-04 13:46
$1重复的行全部删除
  1. sort file | awk -F '|' '$1!=v{if (n==1) print v1;n=0;v1=""}{n++;v1=v1?v1"\n"$0:$0;v=$1}'
复制代码

作者: cheungjustin    时间: 2010-06-04 13:47
回复 5# liaosnet


    前面這個!表示咩意思啊?
作者: ywlscpl    时间: 2010-06-04 13:55
回复  liaosnet


    前面這個!表示咩意思啊?
cheungjustin 发表于 2010-06-04 13:47



    !表示非
作者: luck_libiao    时间: 2010-06-04 14:16
回复 16# Shell_HAT


    是要保留一行的,问题已经解决了,还多些各位兄弟的帮组!
作者: lkk2003rty    时间: 2010-06-04 14:33
回复 21# ywlscpl


    最后一行 如果是不重复的 而且sort之后排在最后的话 这行数据会没滴。。。。
作者: ywlscpl    时间: 2010-06-04 14:37
回复 25# lkk2003rty


    多谢提醒,END块忘记写了
  1. sort file | awk -F '|' '$1!=v{if (n==1) print v1;n=0;v1=""}{n++;v1=v1?v1"\n"$0:$0;v=$1}END{if (n==1) print v1}'
复制代码

作者: expert1    时间: 2010-06-04 14:43
楼主啥意思?凡是重复的全部给删掉吗?
作者: lkk2003rty    时间: 2010-06-04 14:52
回复 26# ywlscpl


    还得向您学习  感觉俺写awk写着写着就搞得像写c++一样了。。。没有充分利用awk的特性。。。
作者: iori809    时间: 2010-06-04 15:28
我也分享一个全部删除的HOHO~虽然不是LZ的需求吧

awk 'BEGIN{FS="|";getline;a[$1]=1;var=$0}{if(!a[$1]){print var;var=$0;a[$1]=1}}' test111.txt
作者: ywlscpl    时间: 2010-06-04 15:35
回复 29# iori809

你写的比我好
我那个问号表达式属于画蛇添足
作者: iori809    时间: 2010-06-04 15:40
回复 30# ywlscpl


   
作者: ywlscpl    时间: 2010-06-04 15:50
本帖最后由 ywlscpl 于 2010-06-04 15:54 编辑

回复 31# iori809


    没仔细看,你写的这个是有问题的

受你启发,发现我那个问号表达式多余
改进如下
  1. sort file | sort file | awk -F '|' '$1!=v{if (n==1) print v1;n=0}{n++;v1=$0;v=$1}END{if (n==1) print v1}'
复制代码

作者: iori809    时间: 2010-06-04 16:11
回复 32# ywlscpl


    awk 'BEGIN{FS="|";getline;a[$1]=1;var=$0}{if(a[$1]&&NR==2){var=""}if(!a[$1]){print var;var=$0;a[$1]=1}}' test111.txt     

就因为有你这样的人,我们才能不断进步HOHO~ 这个应该差不多了~不过不太好看了
作者: expert1    时间: 2010-06-04 16:43
TO LS
你们2人的脚本是做什么的啊?这个帖子我都没看明白,让我也学习一下吧
作者: iori809    时间: 2010-06-04 16:45
删除重复的行~
作者: expert1    时间: 2010-06-04 16:49
只要是重复的行,全部删除?
作者: Shell_HAT    时间: 2010-06-04 16:52
回复 36# expert1


你自己运行一下,看看效果不就知道了?
作者: ywlscpl    时间: 2010-06-04 16:57
本帖最后由 ywlscpl 于 2010-06-04 16:58 编辑
只要是重复的行,全部删除?
expert1 发表于 2010-06-04 16:49



以|为分隔符,遍历全部数据后,只要第一列有重复出现过,包含这样的第一列的行全部删除
作者: keymanlu    时间: 2010-06-04 17:29
sort -u -n file
rainbird2 发表于 2010-06-04 11:21



  我想这个是最容易想到的了,我也只想到用这个
作者: keymanlu    时间: 2010-06-04 17:37
回复  expert1


    以3楼数据为例
4楼的
会把
54887635|20100603123023|20370101000000|DG0000000 ...
lkk2003rty 发表于 2010-06-04 13:01



   楼主就是要保留一行吧,因为distinct是会有一条的
作者: iori809    时间: 2010-06-05 16:32
回复 32# ywlscpl


    awk -F"|" '{array[$1]++;array1[$1]=$0}END{for(i in array){if(array==1){print array1}}}' linux.158  
24000050|20080101000000|20370101000000|DG000000000032398894|
24000044|20080101000000|20370101000000|DG000000000032378684|
24000045|20080101000000|20370101000000|DG000000000032379995|
54000100|20091228171801|20370101000000|DG000000000037871181|
24000047|20080101000000|20370101000000|DG000000000032380012|
54000101|20091228171801|20370101000000|DG000000000037871193|
54000103|20091228171804|20370101000000|DG000000000037871232|
54000105|20091228171819|20370101000000|DG000000000037871213|
54000106|20091228171819|20370101000000|DG000000000037871209|

这个应该没问题了~不过顺序不能保证了
作者: 怀恋遗忘    时间: 2010-06-06 19:57
来学习一下
作者: luck_libiao    时间: 2010-06-08 13:14
回复 4# aluoyeshi


    兄弟能否给讲下! a[$1]++如何实现去重复行(重复行只保留一行)的呢?由于工作关系,当时做了是可以的,但是没有详细研究,还希望知道的兄弟不吝赐教!
作者: luck_libiao    时间: 2010-06-08 13:15
本帖最后由 luck_libiao 于 2010-06-08 13:17 编辑

回复 41# iori809


    您好:
       数据有近1000万行,你这个for 是否会有效率问题呢?还有这里的array[$1]++ ,究竟表示什么意思?没有看明白!由于工作原因,现在已经学习shell近2个月,能力还是没有多少提升,还得继续努力!
作者: Shell_HAT    时间: 2010-06-08 13:57
回复 43# luck_libiao


参考:
http://bbs.chinaunix.net/viewthread.php?tid=1672726#pid11904888
作者: luck_libiao    时间: 2010-06-08 14:33
回复 45# Shell_HAT


    感谢您的回复,很好的用法,领教了!
作者: aluoyeshi    时间: 2010-06-08 15:28
回复 43# luck_libiao

第一次匹配到$1
a[$1]为0,!a[$1]为1,就执行接下来的动作,同时a[$1]++
第二次匹配到$1
a[$1]此时为1,!a[$1]为0,不往下执行了,a[$1]++
第三次匹配到$1
a[$1]此时为2 ......

不知道说的清楚不?
作者: iori809    时间: 2010-06-08 15:31
回复 44# luck_libiao


    加油吧~在CU你会得到你想要得到的~HOHO
作者: biuuw    时间: 2010-06-08 15:39
好像是华为的文件。

不知道1000万行使用awk去重需要多少时间?

我都是使用数据库的方式去重。
作者: iori809    时间: 2010-06-08 15:44
回复 49# biuuw


    Oracle多长时间呢?
作者: aquino    时间: 2010-06-08 16:45
如果数据量很大的话,为什么不用SQL直接输出你想要的
作者: luck_libiao    时间: 2010-06-11 18:24
回复 51# aquino


    内存库的数据,不支持去重复,无耐。。。。。
作者: luck_libiao    时间: 2010-06-11 18:27
回复 49# biuuw


    1000万的数据去重用:awk -F"|" '!a[$1]++' file,实际用的时间也不到1分钟,感觉效率还可以!
作者: cutecactus    时间: 2010-06-13 15:31
回复 4# aluoyeshi


    超级大牛{:3_189:}
作者: heqingbluesky    时间: 2010-06-17 09:56
学到uniq -w的用法,呵呵。




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