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

Linux 使用awk从多个条目中保留具有mex值的条目,linux,awk,Linux,Awk,我有如下tab delim文本文件: 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 我只想用第二列($2)/第四列($4)除以得到的值生成第四列,并仅保留第四列

我有如下tab delim文本文件:

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  
我只想用第二列($2)/第四列($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 
但它失败了,没有给我想要的输出。任何指导都将不胜感激


提前感谢。

使用Perl代替awk:

< myfile.txt perl -ape 's%$%" " . $F[1]/$F[3]%e' \
| sort -k1,1 -k5,5nr \
| sort -k1,1 -u

Perl只是添加了新的列。第一个排序然后按类别和新列进行排序,第二个排序只保留每个类别的第一行。

假设文件按
$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;

注意
awk'{$5=($2/$4)*100}'
不会打印任何内容。您至少需要说
awk'{…}1'文件
才能打印该行。感谢您的评论,但是如何保留多个条目的最大值为$5的条目?