查找列中的最高值并在新列中打印值

查找列中的最高值并在新列中打印值

我正在尝试以下操作。

我有一个包含 6 列的制表符分隔文件。我想创建一个新列并打印 6 列中每行找到的最高值。

我的文件如下所示:

0       0.5     0.5     0       0       0
0       0       0.666667        0       0       0.333333
0.666667        0       0       0       0       0.333333
0.75    0       0       0       0       0.25
0.857143        0       0       0.142857        0       0
0.285714        0       0       0.714286        0       0
0       0.8     0       0.2     0       0
0       0.888889        0.111111        0       0       0
0       0.6     0.4     0       0       0
0       0       0.25    0.75    0       0

我想得到这个:

0       0.5     0.5     0       0       0   0.5
0       0       0.666667        0       0       0.333333    0.666667
0.666667        0       0       0       0       0.333333    0.666667
0.75    0       0       0       0       0.25    0.75
0.857143        0       0       0.142857        0       0   0.857143
0.285714        0       0       0.714286        0       0   0.714286
0       0.8     0       0.2     0       0   0.8
0       0.888889        0.111111        0       0       0   0.888889
0       0.6     0.4     0       0       0   0.6
0       0       0.25    0.75    0       0   0.75

我知道如何创建一个新列来附加我的请求,通过

awk -F'\t' -v OFS='\t' '{ $(NF+1)=???????? ; print}'

但不知道如何要求 awk 找到 col1-col6 之间的最高值。应该对每一行进行此操作。

答案1

这应该相当简单:您可以简单地迭代所有字段并检查哪一个是该行中最高的。然后,将该最高值附加为第 (NF+1) 个字段。

awk 'BEGIN{FS=OFS="\t"} {max=$1; for (i=2;i<=NF;i++) {if (max<$i) {max=$i}}; $(NF+1)=max} 1' input.txt

请注意,为了获得合理的结果,您应该确保所有行具有相同的列数;上面的程序足够灵活,它可以解析每行具有不同列数的文件而不会阻塞。

更新

如中所述埃德·莫顿的回答,如果改为

awk 'BEGIN{FS=OFS="\t"} {max=$1; for (i=2;i<=NF;i++) {if (max<$i) {max=$i}}; print $0,max}' input.txt

awk因为这可以避免在修改任何单个字段(包括分配新字段)时重新构建行。

相关内容