如何根据awk中的值选择行?



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

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中的哈希值):

<>之前BBBB 300 something_6 something_elsea:我不知道

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

$ sort -k1,2nr file | awk '!a[$1]++'
AAAA 2000 something3 something_else3
BBBB 300 something6 something_else6

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

相关内容

  • 没有找到相关文章

最新更新