私は以下を試しています。
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
これは、単一フィールドが変更されると(新しいフィールド割り当てを含む)行を再構築するのを防ぐためです。