免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11574 | 回复: 14

[文本处理] shell 如何根据某一列去重,获取某一列的最大值? [复制链接]

论坛徽章:
1
丑牛
日期:2013-09-29 19:04:50
发表于 2015-07-06 18:06 |显示全部楼层
不知道怎么说,举个例子吧;

  1. google    34
  2. google    37
  3. baidu      72
  4. baidu      36
  5. google     12
  6. google     48
  7. sina         54
  8. sina         64
  9. qq           21
复制代码
根据第一列去重, 获取第二列的最大值之后的处理结果如下:

  1. google     48
  2. baidu      72
  3. sina        64
  4. qq           21
复制代码
求shell

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
发表于 2015-07-06 18:08 |显示全部楼层
  1. sort -k2,2n file | awk '!a[$1]++'
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2015-07-06 18:10 |显示全部楼层
回复 1# solu

$ awk '{if(a[$1]==""||a[$1]<$2)a[$1]=$2}END{for(n in a)print n"\t"a[n]}' FILE
google        48
qq        21
sina        64
baidu        72

   

论坛徽章:
1
丑牛
日期:2013-09-29 19:04:50
发表于 2015-07-06 18:15 |显示全部楼层
谢谢大家

论坛徽章:
1
丑牛
日期:2013-09-29 19:04:50
发表于 2015-07-06 18:16 |显示全部楼层
回复 2# reyleon


    你这个是求出最小值

论坛徽章:
731
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2015-07-06 18:23 |显示全部楼层
回复 5# solu
  1. sort -k2,2nr file | awk '!a[$1]++'
复制代码

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2015-07-06 19:51 |显示全部楼层
回复 1# solu
  1. $ awk 'a[$1]{a[$1]=a[$1]>$2?a[$1]:$2}!a[$1]{a[$1]=$2}END{for(i in a){print a[i],i}}' file
  2. 48 google
  3. 21 qq
  4. 64 sina
  5. 72 baidu
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
发表于 2015-07-06 20:13 |显示全部楼层
  1. with open('input.txt') as f:
  2.     d = {}
  3.     for line in f:
  4.         field = line.split()
  5.         if field[0] not in d:
  6.             d.setdefault(field[0], [])
  7.         d[field[0]].append(field[1])
  8.     for k in d:
  9.         print k, max(d[k])
复制代码

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
发表于 2015-07-06 20:34 |显示全部楼层
回复 1# solu
  1. $cat test.pl
  2. #!/usr/bin/env perl
  3. use strict;
  4. my (%hash, $max);
  5. while (<ARGV>)
  6. {
  7.         /(\S+)\s+(.*)/;
  8.         $hash{$1} = $max < $2 ? $2: $max;
  9. }
  10. for (keys %hash)
  11. {
  12.         print $_ . "\t" . $hash{$_}, "\n";
  13. }
  14. $./test.pl file
复制代码

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
发表于 2015-07-06 22:48 |显示全部楼层
  1. <?php


  2. $file = file('1.txt');
  3. $data = array();

  4. foreach ($file as $k => $v) {

  5.    $arr = preg_split("/\s+/", $v);


  6.     for ($i=1; $i < count($arr)-1; $i++) {

  7.         $data[$arr[0]] =  ($arr[$i] > $data[$arr[0]])?$arr[$i]:$data[$arr[0]];

  8.     }  

  9. }

  10. foreach($data as $key=>$value){
  11. echo $key."=>".$value."\n";
  12. }


  13. ?>
复制代码
很久没写php了,生疏了。 囧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP