awkを繰り返して、列内の各整数の割合を計算します。

awkを繰り返して、列内の各整数の割合を計算します。

使用したいコード行がありますが、ファイル内のすべての列を繰り返したいと思います。 awkの外でこれを行うことはできますが、本当に遅いです。私の問題は、私がawk内でループをうまく実行できないことです。単純な awk ループを実行できますが、まだ実行できない操作が必要です。したがって、この問題を解決する方法を説明してください。後で役に立ちます。

awkコマンドは、選択した列($ i)の各整数の対応する割合を印刷します。これは現在awkコマンドです: awk -F ',' -v x=$i 'FNR==NR{s+=$x;next;} {printf "%s\n",100*$x/s}' File File

上記のコマンドへの入力例:

1    
4    
3    
2    

上記のコマンドの出力例:

10.00000    
40.00000    
30.00000        
20.00000        

awkでファイル内のすべての列を繰り返す必要があります(ファイル列番号が不明)。

したがって、入力に複数の列がある場合、入力の例は次のようになります。

1,4,2    
4,4,1  
3,1,6    
2,1,1    

出力例:

10.00000,40.00000,20.00000    
40.00000,40.00000,10.00000  
30.00000,10.00000,60.00000    
20.00000,10.00000,10.00000    

以下は私が試したものです(下記)。明らかに間違っています。両方の部分に対してループを実行してみましたが、まったく出力がありませんでした。

awk -F"," 'NR==FNR { for (i=1;i<=NF;i++) {s+=$i;next;} next } { for (i=1;i<=NF;i++)printf "%s%%\n",100*$i/s }' File File

ベストアンサー1

あなたは遠くありません。ただし、forループの挿入は最初のフィールドで実行され、次の行に移動し、その行の他のフィールドを無視するnextため、間違いです。next

awk -F ',' '
    NR==FNR{
        for(i=1;i<=NF;i++){s[i]=s[i]+$i}
        next
    }
    {
        for(i=1;i<NF;i++){printf "%f,",100*$i/s[i]}
        printf "%f\n",100*$NF/s[NF]
    }
' File File

sあなたの試みでは一般的な変数ですが、配列でなければなりません。したがって、s[i]ファイルが一度解析された後の列の合計が含まれます。i

NF最後のコンマを除くすべてのフィールドを印刷する必要があるため、最後のループは含まれません。最後のフィールドの後には改行文字を印刷する必要があります。

出力:

10.000000,40.000000,20.000000
40.000000,40.000000,10.000000
30.000000,10.000000,60.000000
20.000000,10.000000,10.000000

説明が必要な場合はコメントを残してください。

おすすめ記事