我正在尝试以下操作。
我有一个包含 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
因为这可以避免在修改任何单个字段(包括分配新字段)时重新构建行。