別のファイルにレコード範囲を書き込む awk ループ

別のファイルにレコード範囲を書き込む awk ループ

弾性波パターンコードの出力を記述する数千行のファイルがあります。ファイルのサイズは、頻度、モデルの太さ、特定のモデルで見つかったパターンの数によって異なります。ヘッダー情報には、見つかったパターンの数が含まれます。モードは0からNまで番号が付けられ、キーワードMODEの横に保存されます。ファイルが最初の2つのパターンを見つける方法は次のとおりです。この例では、0から4までの4つのモードがあります。 「I DEPTH Y1 Y2 Y3 Y4」レコードの後に​​は、振幅を提供する1,000を超えるレコードが続きます。最初の2つのモードでは、最初の2つのレコードのみを表示しています。 awkとモード/ MODE /を使用すると、個々のMODE番号を簡単に選択できます。各モード(mode_0、mode_1、...)に対して、そのモードに対応する1000個程度の値を含む別々のファイルを作成したいと思います。最初の awk 呼び出しを使用してファイルを生成することはできますが、最初の awk 呼び出しで生成されたファイルに、対応するパターン振幅値の何千ものレコードをインポートすることはできません。失敗した試みは2番目のawk呼び出しでした。

    ########## MODE NUMBER is "  0"     (RAYLEIGH WAVE) ##########
I    DEPTH          Y1             Y2             Y3             Y4
1   3.000000E-01   9.999983E-01   1.166993E+06  -1.280462E-02   0.000000E+00
2   6.000000E-01   9.999933E-01   2.351593E+06  -2.580244E-02   0.000000E+00
     This continues for a thousand or so records.
-1  0.000000E+00   0.000000E+00   0.000000E+00   0.000000E+00   0.000000E+00

    ########## MODE NUMBER is "  1"     (RAYLEIGH WAVE) ##########
I    DEPTH          Y1             Y2             Y3             Y4        1   3.000000E-01   9.999960E-01   1.183126E+06  -1.280343E-02   0.000000E+00
2   6.000000E-01   9.999840E-01   2.367720E+06  -2.562274E-02   0.000000E+00
         This continues for a thousand or so records.
-1  0.000000E+00   0.000000E+00   0.000000E+00   0.000000E+00   0.000000E+00

単一モデルの最後の行は、常に最後のレコードの最初のフィールドで -1 で終わります。レコード数は可変であり、通常1000以上です。次いで、次のパターンは、第3のレコードの第1のフィールドで1で始まり、パターンの最後のレコードの第1のフィールドで-1で終わる前のパターンとまったく同じ形式で始まる。

私がしようとしていたものは次のとおりです。

  1. 各モードに対して、mode_0、mode_1、mode_2、...、mode_Nというラベルの付いた別々のファイルを作成します。
  2. 対応するmode_nファイルにモード振幅値を書き込みます。値は、「I DEPTH ...」ラベルの下の浮動小数点数です。

以下の最近の試みでわかるように、私はawkの経験が非常に欠けています。この例には、mode_0からmode_4までの合計5つのモードがあります。 awkへの最初の呼び出しは期待どおりに機能し、別々のスキーマファイルを生成します。 2番目のawk呼び出しは、さまざまなスキーマファイルに値を書き込もうとした多くの失敗した試みの1つでした。また、awkスコープモード/1/、/-1/を試しましたが、動作しませんでした。私は2番目のawk呼び出しが以下にリストされているモードの1つでのみ動作しようとしましたが、成功しませんでした。最初の行の最初のフィールドに「I」を持つレコードと、最初のフィールドに「-1」を持つ最後のレコードのモード振幅値の間のすべてのモード振幅値を取得する方法を見つけようとしています。モーダル振幅浮動小数点は負数にすることができますが、「-1」は厳密に言うと整数であり、スペースで囲まれているため、各個々のモーダル振幅値の最後のレコードを検索するのに最適なパターンになります。

gawk '/MODE / {

if($6 == "0\"" ) $6 = 0 # Remove double quotes from MODE 0" which only occurs for mode 0.
  arr[i] = substr( $6,1,length($6-1))
 {print $0 >> ("mode_"arr[i])}
}' inputfile
gawk '{ for (i = 1 ; i <= 4; i++)
 if ( ( arr[i] == 0 ) &&
    (  $1 == " I " && $1 != " -1 ") )
 print $0 >> ("mode_"arr[i])
}' inputfile

ベストアンサー1

この試み:

gawk '{
  if ($1 == "##########") {
    FS = "\"";
    $0 = $0;
    close(modefile);
    modefile = "mode_"int($2);
    FS = " "
  } else {
    if ($1 != "-1")
      print $0 >> modefile
  }
}' inputfile

おすすめ記事