linux - 使用awk从多个条目中保留一个具有mex值的条目

标签 linux awk

我有如下的制表符分隔文本文件:

A1 230 12 250
A1 100 20 135
A1 90 15 210
A2 150 23 300
B2 300 14 350
B2 190 34 200
B3 210 4 273
B3 100 0 123
C1 110 7 132
C1 98  3 132
C1 101 0 150
D1 301 12 230
D1 660 20 700
D1 275 12 700  

我想要的是生成第 4 列,其值是通过划分第二列($2)/第四列($4)获得的,并且只保留那些在第 4 列中具有最大值的条目用于多个条目并打印文件如下所示:

A1 230 12 250
A2 150 23 300
B2 190 34 200
B3 100 0 123
C1 110 7 132
C1 101 0 150
D1 301 12 230
D1 660 20 700

我尝试了以下命令

awk '{$5=($2/$4)*100}' myfile.txt |sort|uniq 

但它失败了,没有给出我想要的输出。任何指导将不胜感激。

提前致谢。

最佳答案

假设文件按$1预先排序:

awk '
# Print the max record when we encounter a different $1
FNR != 1 && prev != $1 {
  print maxRecord;
  # Set variables
  prev = $1;
  maxCalc = 0;
}
{
  # Find the max between calc and maxCalc
  calc = ($2/$4)*100;
  if (calc > maxCalc) { 
    maxRecord = $0;
    maxCalc = calc;
  }
}
END{print maxRecord}' file 

这不会设置第五条记录(计算),但如果您需要,可以在 maxRecord = $0 之前简单地添加以下内容:

$5 = calc;

关于linux - 使用awk从多个条目中保留一个具有mex值的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33735390/

相关文章:

bash - 使用 sed 脚本从文本文件中删除时间戳

c++ - 如何在 Linux 中从 Cirque 触摸板读取点击的绝对位置

c - 如果请求超出可用物理内存,如何使malloc/calloc失败(即,不要使用swap)

linux - 如何使用 linux 设备模型和/sys 文件系统?

awk - 检查值是否在两个数字之间

awk - 使用 awk 将每个字符打印为自己的列?

linux - 需要在来自远程 ssh 的文件末尾的特定行插入一个单词

c - 如果我们首先在 if 或 while 中使用 fork() 为什么会返回双零

PHP 运行 curl with exec 不工作

bash - 从日志文件中提取关键字