列で最も高い値を見つけて、新しい列の値を印刷します。

列で最も高い値を見つけて、新しい列の値を印刷します。

私は以下を試しています。

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}'

しかし、col1とcol6の間で最も高い値を見つけるためにawkに要求する方法がわかりません。これは各行に対して実行する必要があります。

ベストアンサー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

合理的な結果を得るには、すべての行に同じ数の列があることを確認する必要があります。上記のプログラムは、ブロックせずに1行あたりの列数が異なるファイルを解析するのに十分柔軟です。

修正する:

で述べたようにエドモートンの答え、に変更された場合

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

awkこれは、単一フィールドが変更されると(新しいフィールド割り当てを含む)行を再構築するのを防ぐためです。

おすすめ記事