1

Linux 问题:我有data.csv包含以下字段和值的 CSV 文件

KEY,LEVEL,DATA
2.456,2,aaa
2.456,1,zzz
0.867,2,bbb
9.775,4,ddd
0.867,1,ccc
2.456,0,ttt 
...

该字段KEY是一个浮点值,LEVEL而是一个整数。我知道第一个字段和第二个字段可以有重复的值,但如果你把它们放在一起,你会有一对独特的。

我想要做的是根据列对文件进行排序KEY,然后对于下的每个唯一值,KEY只保留下具有较高值的​​行LEVEL。排序不是问题:

$> sort -t, -k1,2 data.csv  # fields: KEY,LEVEL,DATA
0.867,1,ccc
0.867,2,bbb
2.456,0,ttt
2.456,1,zzz
2.456,2,aaa
9.775,4,ddd
...

但是我怎样才能过滤行以便我得到我想要的,即:

0.867,2,bbb
2.456,2,aaa
9.775,4,ddd
...

有没有办法使用 , 等命令行工具来做到sortuniq一点awk?提前致谢

4

3 回答 3

4

试试这一行:

your sort...|awk -F, 'k&&k!=$1{print p}{p=$0;k=$1}END{print p}'

输出:

kent$  echo "0.867,1,bbb
0.867,2,ccc
2.456,0,ttt
2.456,1,zzz
2.456,2,aaa
9.775,4,ddd"|awk -F, 'k&&k!=$1{print p}{p=$0;k=$1}END{print p}'
0.867,2,ccc
2.456,2,aaa
9.775,4,ddd

这个想法是,因为您的文件已经排序,只需从顶部遍历文件/输入,如果第一列 ( ) 更改,则打印最后一行,即lastKEY的最大值LEVELKEY

尝试使用您的真实数据,它应该可以工作。

整个逻辑(根据您的排序)也可以由 awk 在单个进程中完成。

于 2013-04-23T14:05:19.233 回答
3

利用:

$> sort -r data.csv | uniq -w 5 | sort

鉴于您的花车格式为“0.000”-“9.999”

于 2013-04-23T14:06:29.473 回答
0

Perl 解决方案:

perl -aF, -ne '$h{$F[0]} = [@F[1,2]] if $F[1] > $h{$F[0]}[0]
               }{
               print join ",", $_, @{$h{$_}} for sort {$a<=>$b} keys %h' data.csv

请注意,结果与您请求的结果不同,第一行包含bbb,而不是ccc

于 2013-04-23T14:06:24.450 回答