如何在awk中选择值的行?

时间:2015-09-15 17:25:33

标签: bash awk fileparsing

假设我有一个文件结构如下:

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做到这一点?

3 个答案:

答案 0 :(得分: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条记录(因为你说你的输入文件很大,可能很重要),按照它们读取的相同顺序打印记录,甚至可以用于零或负{{1}值,并且不会为空输入文件输出任何内容。

答案 1 :(得分:1)

你可以尝试

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

你得到(顺序可能不同,因为它取决于a中的哈希):

BBBB 300 something6 something_else6
AAAA 2000 something3 something_else3

答案 2 :(得分:1)

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

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

AAAA 2000 something3 something_else3
BBBB 300 something6 something_else6

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