+ -
当前位置:首页 → 问答吧 → 求助处理一组数据

求助处理一组数据

时间:2011-03-23

来源:互联网

有这样一个格式文件,空白处为制表符隔开
CACNA        53586        chr12        2492350        2545936
CACNA        637634        chr12        2032989        2670623
CACNA        637634        chr12        2032989        2670623
CACNA        53586        chr12        2492350        2545936
CACNA        53586        chr12        2492355        2545941
CACNA        53586        chr12        2492350        2545936
CACNA        53586        chr12        2492350        2545936
CACNA        53586        chr12        2492350        2545936
CACNA        637634        chr12        2032989        2670623
CACNA        53586        chr12        2492350        2545936
CACNA        637634        chr12        2032989        2670623
CACNA        53586        chr12        2492350        2545936
PEX5        19843        chr16        7234240        7254083
AA1C        54387        chr10        2492560        2915952

第一列没有重复的,输出整行
第一列有多个的,比较第二列的大小,选择最大的那一个输出整行,最大值有多个相等的,输出出现最早的那一行。
(有的行是完全一致的,因为还有其他的列会不一致,没有粘贴全)


理论结果应该是
CACNA        637634        chr12        2032989        2670623
PEX5        19843        chr16        7234240        7254083
AA1C        54387        chr10        2492560        2915952
谢谢

作者: feiyue0908   发布时间: 2011-03-23

awk '{if($2>a[$1]){a[$1]=$2;b[$1]=$0}}END{for(i in b){print b[i]}}' file

作者: ziyunfei   发布时间: 2011-03-23



QUOTE:
awk '{if($2>a[$1]){a[$1]=$2;b[$1]=$0}}END{for(i in b){print b}}' file
ziyunfei 发表于 2011-03-23 13:33



这个已经超出我的理解了,新手,看不懂啊

作者: feiyue0908   发布时间: 2011-03-23

本帖最后由 dgtnk 于 2011-03-23 13:51 编辑

回复 feiyue0908
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hash;
  5. while (<>){
  6.         my $line = $_;
  7.         my @info = split /\s+/;
  8.         my $name = $info[0];
  9.         my $value = $info[1];
  10.         if ((defined $hash{$name} && $value > $hash{$name}{"value"}) || (not defined $hash{$name})) {
  11.                 $hash{$name} = {
  12.                         "value" => $value,
  13.                         "info" => $line,
  14.                 };
  15.         }
  16.         else {
  17.                 next;
  18.         }
  19. }

  20. foreach my $name (sort keys %hash) {
  21.         print $hash{$name}{"info"};
  22. }
复制代码

作者: dgtnk   发布时间: 2011-03-23

回复 dgtnk


    输出结果是对的,得好好拜读才能看明白,谢谢

作者: feiyue0908   发布时间: 2011-03-23



QUOTE:
awk '{if($2>a[$1]){a[$1]=$2;b[$1]=$0}}END{for(i in b){print b}}' file
ziyunfei 发表于 2011-03-23 13:33




    偶发现ziyuefei一直用的AWK哎。真是羡慕,偶看过后不用就忘了,伤了AWK的心

作者: seufy88   发布时间: 2011-03-23