免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3236 | 回复: 7
打印 上一主题 下一主题

请教按重复次数排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-10 20:42 |只看该作者 |倒序浏览
搜了两天,学了如http://bbs.chinaunix.net/viewthread.php?tid=771913之类的例子,但自己还是未做成功,还请大家帮忙,先道谢了!
有以下数据,要按第二列数据重复次数的多少将原文排序(从多到少),在第一列要含有2005至2007中任一个数才留下(但留下的重复项对应的列一为2004的行也不能删),每两组重复项间用空行或其他标志隔开,在每一行最后一列打上各重复项的重复次数;含有2005至2007中任一数但不重复的所有数据单独装入一个文件,不知说清楚没
2004 2526384401 300 1222
2004 2526384402 300 1222
2005 2526384401 300 1222
2004 2526384401 300 1222
2004 2526384403 300 1222
2004 2526384401 300 1222
2006 2526384401 300 1222
2004 2526384404 300 1222
2005 2526384408 300 1222
2004 2526384402 300 1222
2004 2526384408 300 1222
2006 2526384402 300 1222
2004 2526384403 300 1222
2007 2526384408 300 1222
2005 2526384407 300 1222
2006 2526384407 300 1222
2004 2526384404 300 1222
2004 2526384404 300 1222
2004 2526384407 300 1222
2004 2526384407 300 1222
2004 2526384408 300 1222
2007 2526384401 300 1222
2004 2526384404 300 1222
2004 2526384401 300 1222
2004 2526384408 300 1222
2004 2526384404 300 1222
2004 2526384408 300 1222
2007 2526384402 300 1222
2004 2526384405 300 1222
2007 2526384406 300 1222
2006 2526384406 300 1222

结果:

文件1
2004 2526384401 300 1222 7
2004 2526384401 300 1222 7
2004 2526384401 300 1222 7
2004 2526384401 300 1222 7
2005 2526384401 300 1222 7
2006 2526384401 300 1222 7
2007 2526384401 300 1222 7

2004 2526384408 300 1222 6
2004 2526384408 300 1222 6
2004 2526384408 300 1222 6
2004 2526384408 300 1222 6
2005 2526384408 300 1222 6
2007 2526384408 300 1222 6

2004 2526384402 300 1222 4
2004 2526384402 300 1222 4
2006 2526384402 300 1222 4
2007 2526384402 300 1222 4

2004 2526384407 300 1222 4
2004 2526384407 300 1222 4
2005 2526384407 300 1222 4
2006 2526384407 300 1222 4


文件2
2007 2526384406 300 1222
2006 2526384406 300 1222
不合条件的不要:
2004 2526384404 300 1222
2004 2526384404 300 1222
2004 2526384404 300 1222
2004 2526384404 300 1222
2004 2526384404 300 1222
2004 2526384403 300 1222
2004 2526384403 300 1222

论坛徽章:
0
2 [报告]
发表于 2007-02-10 22:20 |只看该作者
> list.txt
cat youfile | awk '{print $2}' | sort -u | while read line
do
  cat youfile | grep $line | sort | uniq -c >> list.txt
  echo " " >> list.txt
done

cat list.txt | grep -v "^2004" | awk '$5=="1" {print $1,$2,$3,$4}' > list_2006-7.txt

不知道是不是你想要的.

论坛徽章:
0
3 [报告]
发表于 2007-02-10 22:59 |只看该作者
先谢谢,现在无法测试,测了再回

论坛徽章:
0
4 [报告]
发表于 2007-02-11 09:12 |只看该作者
下面的脚本可以实现,但效率很低。


  1. # 提取第二列的值
  2. cat yourfile.txt|awk ' { print $2; } '|sort -u>sort2_u.list

  3. # 统计每个值得出现次数,楼上用到的uniq -c应该是一个更好的方法
  4. >count2.list
  5. for value2 in `cat sort2_u.list`
  6. do
  7.     awk -v value2=$values '
  8.     BEGIN{ icount = 0; }
  9.     {
  10.         if ( ~ value2 )
  11.         {
  12.             icount = icount + 1;
  13.         }
  14.     }
  15.     END{ printf( "%s %10d\n", value2, icount ); } ' >> count2.list
  16. done

  17. # 按照统计结果排序
  18. cat count2.list | sort -nrk2,2>count2_sort.list

  19. # 依据排序结果重新输出
  20. for count2_value in `cat count2_sort.list`
  21. do
  22.     awk /$count2_value/ yourfile.txt
  23. done > accu_times_sort.txt
复制代码

[ 本帖最后由 Cion 于 2007-2-11 09:17 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-02-11 21:37 |只看该作者

谢谢你们的帮助

我先试了一下轩静天的,已成功,测试结果是
4 2004 2526384401 300 1222
1 2005 2526384401 300 1222
1 2006 2526384401 300 1222
1 2007 2526384401 300 1222

2 2004 2526384402 300 1222
1 2006 2526384402 300 1222
1 2007 2526384402 300 1222

2 2004 2526384403 300 1222

5 2004 2526384404 300 1222

1 2004 2526384405 300 1222

1 2006 2526384406 300 1222
1 2007 2526384406 300 1222

2 2004 2526384407 300 1222
1 2005 2526384407 300 1222
1 2006 2526384407 300 1222

4 2004 2526384408 300 1222
1 2005 2526384408 300 1222
1 2007 2526384408 300 1222
请轩静天再帮下忙,如下
4 2004 2526384401 300 1222
1 2005 2526384401 300 1222
1 2006 2526384401 300 1222
1 2007 2526384401 300 1222
其中重复4次的那一行不要省略只显一次,仍然要显示原有的重复明细如下,且重复次数为第二字段的次数即7次
7 2004 2526384401 300 1222
7 2004 2526384401 300 1222
7 2004 2526384401 300 1222
7 2004 2526384401 300 1222
7 2005 2526384401 300 1222
7 2006 2526384401 300 1222
7 2007 2526384401 300 1222
其他组也一样,谢谢

如果某一组重复数据的第一列不含2005-2007中任一数则删去不要,但不要以只含2004为筛选条件,因为数据可能有2003、2002之类的,如
2004 2526384404 300 1222
2004 2526384404 300 1222
2004 2526384404 300 1222
2004 2526384404 300 1222
2004 2526384404 300 1222
该组重复数据就不再需要

[ 本帖最后由 grljt 于 2007-2-11 23:05 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-02-11 22:30 |只看该作者
cat list.txt | grep -v "^2004" | awk '$5=="1" {print $1,$2,$3,$4}' > list_2006-7.txt 没达到所要效果,当第二列数据不重复且第一列是2005-2007任一数时装入新文件(原始数据有点错,最后一行应为2426384409)即生成文件如下:
2007 2526384406 300 1222
2006 2526384409 300 1222
请再指教

论坛徽章:
0
7 [报告]
发表于 2007-02-12 14:26 |只看该作者
cat list.txt | grep -v "^2004" | awk '$5=="1" {print $1,$2,$3,$4}' > list_2006-7.txt

位置记错了,应该是:

cat list.txt | awk '{print $2,$3,$4,$5,$1}' | grep -v "^2004" | awk '$5=="1" {print $1,$2,$3,$4}' > list_2006-7.txt

如果要实现你的那些统计结果,我个人建议你还是把数据入库,用SQL来处理要方便的多,用文本方式一是太麻烦,二是效率很低.

用文件的方法我大概弄了一个,你只要按你文件第二列建立一个序列处理就可以了
> list.txt
cat yourfile | awk '{print $2}' | sort | uniq -c | while read line
do
A=`echo $line | awk '{print $1}'`
B=`echo $line | awk '{print $2}'`

cat yourfile | grep $B  | while read line_1
do
echo "$A $line_1" >> list.txt
done
echo " " >> list.txt
done

[ 本帖最后由 轩静天 于 2007-2-12 14:33 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-02-13 00:14 |只看该作者
非常感谢轩静天再次帮助,,看来该学学sql,本次测试结果
7 2004 2526384401 300 1222
7 2005 2526384401 300 1222
7 2004 2526384401 300 1222
7 2004 2526384401 300 1222
7 2006 2526384401 300 1222
7 2007 2526384401 300 1222
7 2004 2526384401 300 1222

4 2004 2526384402 300 1222
4 2004 2526384402 300 1222
4 2006 2526384402 300 1222
4 2007 2526384402 300 1222

2 2004 2526384403 300 1222
2 2004 2526384403 300 1222

5 2004 2526384404 300 1222
5 2004 2526384404 300 1222
5 2004 2526384404 300 1222
5 2004 2526384404 300 1222
5 2004 2526384404 300 1222

1 2004 2526384405 300 1222

2 2007 2526384406 300 1222
2 2006 2526384406 300 1222

4 2005 2526384407 300 1222
4 2006 2526384407 300 1222
4 2004 2526384407 300 1222
4 2004 2526384407 300 1222

6 2005 2526384408 300 1222
6 2004 2526384408 300 1222
6 2007 2526384408 300 1222
6 2004 2526384408 300 1222
6 2004 2526384408 300 1222
6 2004 2526384408 300 1222
未按重复次数排序,未去除不含2005-2007的数据,但已经好办多了,所需排序效果可再按上述结果的第一列大小排序,怎样删除第一列全是不含2005-2007的数据我再想想吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP