假设我有一个结构如下的文件:
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来做吗?
$ 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
值也能工作,并且对于空的输入文件不会输出任何东西。
你可以试试
awk '
!($1 in max) || ($2>max[$1]) {
max[$1]=$2; a[$1]=$0;
}
END{
for(i in a){
print a[i];
}
}' input_file
你得到(顺序可能不同,因为它取决于a
中的哈希值):
sort/awk的组合将是最简单的
$ sort -k1,2nr file | awk '!a[$1]++'
AAAA 2000 something3 something_else3
BBBB 300 something6 something_else6
按第一个字段和第二个字段排序(降序),让awk选择组的第一行(按设计最高)。