我的输入文件是这样的。
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列的最高值)
提前致谢...
答案 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