我有制表符分隔文本文件,如下所示:
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
但它失败并没有给出我想要的输出。任何指导都将不胜感激。
提前致谢。
答案 0 :(得分:2)
假设文件按$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;
答案 1 :(得分:0)
使用Perl而不是awk:
< myfile.txt perl -ape 's%$%" " . $F[1]/$F[3]%e' \
| sort -k1,1 -k5,5nr \
| sort -k1,1 -u
Perl只是添加了新列。第一种排序然后按类别和新列排序,第二种排序只保留每个类别的第一行。