0

次のような構造のファイルがあるとします。

AAAA 700 something1 something_else1
AAAA 98 something2 something_else2
AAAA 2000 something3 something_else3
BBBB 200 something4 something_else4
BBBB 21 something5 something_else5
BBBB 300 something6 something_else6

列 $1 の各値について、列 $1 の値が最も高い行全体を抽出する必要があります。これは、フィールド AAAA の場合、$2=2000 の行を出力する必要があることを意味します。したがって、出力は次のようになります。

AAAA 2000 something3 something_else3
BBBB 300 something6 something_else6

pythonでやったのですが、ファイルが巨大で処理にとても時間がかかります。awkでそれを行う方法はありますか?

4

3 に答える 3

3
$ cat tst.awk
$1!=prev { if (rec!="") print rec; max=$2; rec=$0 }
$2 > max { max=$2; rec=$0 }
{ prev=$1 }
END { if (rec!="") print rec }

$ awk -f tst.awk file
AAAA 2000 something3 something_else3
BBBB 300 something6 something_else6

上記は、$1サンプル入力に示されているように、値が常にグループ化されていることを前提としています。そのため、一度に 1 つのレコードのみをメモリに格納し (入力ファイルが巨大であり、重要である可能性があるため)、読み取った順序でレコードを出力し、ゼロまたは負の$2値でも機能し、空の入力ファイルには何も出力しません。

于 2015-09-15T18:05:35.210 に答える