3

if else 条件を使用して awk for ループの配列に awk の戻り値を格納する際に助けを求めます。

If  $3 == $7
then print $9 multiplied by $4
else print $4 multiplied by (2 minus $9)

これまでのところ、次の方法で機能しています。

awk '{if ($3 == $7) print $9*$4; else print $4*(2-$9);}' file >outfile

上記のコードは、最初のデータ列 ( $9) に対して機能します。ただし、9 から 1547 までのすべての列をループして、戻り値を含む配列を返したいと考えています。これは十分に単純なはずですが、ここでいくつかの基本的な概念を理解できないようです。

これまでのところ、実際の関数の前に、次の方法でループ数を宣言する必要があることを理解しています。

awk ' {for(i=9;i<=NF;i++)} END {if ($3 == $7) print $i*$4; そうでない場合は $4*(2-$i);}' を出力します。

ただし、配列をいつどのように宣言するかは、私 (生物学者) を超えています。どんな助けでも大歓迎です。

例:

入力 (大きなファイル.. ここでは列 1-10):

rs2070501 22A 0.0206 0.337855 rs2070501 GA 0.977 0.066

出力:

0.0210738

ここで、else ステートメントが有効になります ($3 * (2-$9)

列9だけでなく、配列9-Nthを出力するようにawkを取得する方法

4

1 に答える 1

5

これで試してみてください。

awk '{
    for(i=9; i<=NF; ++i)
        printf "%s%f",
            (i==9 ? "" : " "),
            ($3 == $7 ? $i*$4 : $4*(2-$i));
    printf "\n"
}' filename

( test ? when : else )省略形です。?テストが true の場合はafterが評価され、:そうでない場合は after が評価されます。したがって、最初のフィールドには空のセパレーターが出力され、それ以外の場合はスペースが出力されます。$3 == $7が trueかどうかに応じて、フィールドの値を計算する方法を選択します。

于 2012-05-30T13:12:56.750 に答える