gpt4 book ai didi

unix - 获取每一行的最高绝对值(awk)

转载 作者:行者123 更新时间:2023-12-02 16:34:27 35 4
gpt4 key购买 nike

我有一个包含多行和多列制表符分隔的文件,例如:

ID    v1        v2      v3     v4      v5     v6
A10 -0.2134 -0.190 -0.114 0.400 10.678 -0.123
A115 -0.5038 -0.559 -0.664 0.431 0.139 -0.860
AAAS -0.9072 -0.990 -1.251 3.153 -0.756 0.674

我想从每一行中获取最大的绝对数,如果是负数或正数,则打印出来,同时打印相应列中的标题 ID,例如:

A10   10.678 v5  
A115 -0.860 v6
AAAS 3.153 v4

我能够计算出每一行的最小值和最大值,但我不确定如何获得最高的绝对值和 ID:

 awk  'NR>1{a=0; b=0; for (i=1;i<=NF;i++) if ($i < a || i == 1)a = $i; else if($i > b|| i == 1)b = $i; print $1,a, b}' file

A10 -0.2134 10.678
A115 -0.860 0.431
AAAS -1.251 3.153

最佳答案

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR == 1 {
split($0,hdrs)
next
}
{
maxVal = 0
for (i=2; i<=NF; i++) {
val = ($i >= 0 ? $i : - $i) + 0
if ( val >= maxVal ) {
maxVal = val
maxFld = i
}
}
print $1, $maxFld, hdrs[maxFld]
}

.

$ awk -f tst.awk file
A10 10.678 v5
A115 -0.860 v6
AAAS 3.153 v4

如果您可以有多个最大值,例如:

$ cat file
ID v1 v2 v3 v4 v5 v6
A10 -0.2134 10.678 -0.114 10.678 10.678 -0.123
A115 -0.5038 -0.559 0.860 0.431 0.139 -0.860
AAAS -0.9072 -0.990 -1.251 3.153 -0.756 0.674

然后上面的脚本将打印最后一个最大值的 header ID。如果你想打印第一个,那么这是一个明显的微不足道的调整,如果你想列出所有相关的标题,那么:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR == 1 {
split($0,hdrs)
next
}
{
delete val2hdrs
maxVal = 0
for (i=2; i<=NF; i++) {
val = ($i >= 0 ? $i : - $i) + 0
if ( val >= maxVal ) {
maxVal = val
maxFld = i
val2hdrs[val] = (val in val2hdrs ? val2hdrs[val] "," : "") hdrs[i]
}
}
print $1, $maxFld, val2hdrs[maxVal]
}

.

$ awk -f tst.awk file
A10 10.678 v2,v4,v5
A115 -0.860 v3,v6
AAAS 3.153 v4

关于unix - 获取每一行的最高绝对值(awk),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62959846/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com