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 回答
1

sort/awk 的组合将是最简单的

$ sort -k1,2nr file | awk '!a[$1]++'

AAAA 2000 something3 something_else3
BBBB 300 something6 something_else6

按第一个字段和第二个字段(降序)排序,让 awk 选择组的第一行(按设计最高)。

于 2015-09-15T18:26:34.797 回答
1

你可以试试

awk '
!($1 in max) || ($2>max[$1]) {
  max[$1]=$2; a[$1]=$0;
} 
END{ 
  for(i in a){ 
    print a[i];
  }
}' input_file

你得到(顺序可能不同,因为它取决于 hash in a):

BBBB 300 something6 something_else6
AAAA 2000 something3 something_else3
于 2015-09-15T17:30:55.967 回答