1

data.csvLinux に関する質問:次のフィールドと値を含む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が、 は整数です。最初のフィールドは 2 番目のフィールドと同様に繰り返し値を持つことができることはわかっていますが、それらを一緒にすると、一意のカップルになります。

私がしたいのは、列に従ってファイルをソートし、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
...

sort、 などのuniqコマンドライン ツールを使用してそれを行う方法はあり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

アイデアは、ファイルが既にソートされているため、最初の列 ( KEY) が変更された場合は、ファイル/入力を上から調べて、最後の行の最大値である最後の行をLEVEL出力することです。KEY

実際のデータで試してみてください。うまくいくはずです。

また、ロジック全体(並べ替えを含む)は、単一のプロセスで 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 に答える