2

awk を使用して編集したい数百のテキスト ファイルがあります。その例は

5483.39  5134.64  4602.88  3953.89  3271.87  2495.87  1788.98  1285.57  1034.09  1196.25  1851.03  2874.14  3797.68  4361.26  4717.09  4829.74  4760.26  4758.12  4790.80  4763.77  4734.56  3311.89 -811.57 -6152.48

次のアルゴリズムを使用して編集したいと思います。最後の値 (この場合) から始めて、-6152.48カウント数がフィールド 1 の 85% 未満かどうかを確認したいと思います。これが true の場合、このフィールド値を $1 の値にリセットします。次に、$(NF-1) などについて繰り返します。ただし、この 85% 条件が満たされないフィールド値に初めて遭遇したとき (つまり、$i > 0.85*$1)、ループをエスケープしてすべてを終了したいと思います。他のフィールドはそのまま。

これを行うには、各フィールド値をスキャンする foreach ループと、条件をチェックする while ループが必要だと思います。これが私がこれまでに持っているものです

awk 'BEGIN{flag=0} {for(i=1;i<=NF;i++) a[i] = $i/$1} {for(i=NF;i>=1;i--) print a[i],flag}' file

awk を使用して必要なロジックを実装する方法がわかりません。つまり、何らかの条件 if ($i > 0.85 * $1) flag = 1; 次に、上記の for ループをエスケープします。

おそらく、for ループと while ループは必要ありません。

何か案は?

4

1 に答える 1

2

Awk 擬似コード:

for(i=NF; i>=1; i--)
{
   if($i>0.85*$1)
      break;
   else
      print $i;
}

このbreakステートメントは、ループからの脱出という目的を明示的に果たしています。

于 2013-06-05T12:32:20.293 に答える