Text-Processing

在列中查找最大值並在新列中列印值

  • September 29, 2022

我正在嘗試以下。

我有一個包含 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因為這樣可以避免在修改任何單個欄位(包括分配新欄位)時重新建構行。

引用自:https://unix.stackexchange.com/questions/719155