根据unix中的键排序选定的记录

时间:2011-07-12 04:54:02

标签: unix shell sorting awk

我的输入文件是这样的。

01,A,34
01,A,35
01,A,36
01,A,37
02,A,40
02,A,41
02,A,42
02,A,45

我的输出需要

01,A,37
01,A,36
01,A,35
02,A,45
02,A,42
02,A,41

即根据键(第1列和第2列)仅选择前三个记录(基于第3列的最高值)

提前致谢...

2 个答案:

答案 0 :(得分:2)

如果数据如图所示,您可以使用简单的bash脚本执行此操作。

pax$ cat infile
01,A,34
01,A,35
01,A,36
01,A,37
02,A,40
02,A,41
02,A,42
02,A,45

pax$ ./go.sh
01,A,37
01,A,36
01,A,35
02,A,45
02,A,42
02,A,41

pax$ cat go.sh
keys=$(sed 's/,[^,]*$/,/' infile | sort -u)
for key in ${keys} ; do
    grep "^${key}" infile | sort -r | head -3
done

第一行获取完整的键集,通过使用sed删除最后一列,然后使用sort排序输出并删除重复项,从前两个字段构造。在这种特殊情况下,密钥为01,A,02,A,

它提取每个键的相关数据(for循环与grep一起),按{降序排序sort -r,只获得前三个(每个密钥)head

现在,如果您的密钥可能包含grep特殊字符,例如.[,则需要注意。

答案 1 :(得分:0)

使用 Perl

perl -F, -lane'
  push @{$_{join ",", @F[0,1]}}, $F[2];
  END {
    for $k (keys %_) {
      print join ",", $k, $_
        for (sort { $b <=> $a } @{$_{$k}})[0..2]
      } 
    }' infile