假设我有一个文件结构如下:
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做到这一点?
答案 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选择组的第一行(按设计最高)。