Text-Processing
在列中查找最大值並在新列中列印值
我正在嘗試以下。
我有一個包含 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 之間的最大值。應該為每一行完成。
這應該相當簡單:您可以簡單地遍歷所有欄位並檢查該行中哪個是最高的。然後,將該最高值附加為第 (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
請注意,為了獲得合理的結果,您應該確保所有行具有相同的列數;上面的程序足夠靈活,它可以解析每行具有不同列數的文件而不會阻塞。
更新:
正如Ed Morton 的回答中所述,如果您將其更改為
awk 'BEGIN{FS=OFS="\t"} {max=$1; for (i=2;i<=NF;i++) {if (max<$i) {max=$i}}; print $0,max}' input.txt
awk
因為這樣可以避免在修改任何單個欄位(包括分配新欄位)時重新建構行。