弾性波パターンコードの出力を記述する数千行のファイルがあります。ファイルのサイズは、頻度、モデルの太さ、特定のモデルで見つかったパターンの数によって異なります。ヘッダー情報には、見つかったパターンの数が含まれます。モードは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で終わる前のパターンとまったく同じ形式で始まる。
私がしようとしていたものは次のとおりです。
- 各モードに対して、mode_0、mode_1、mode_2、...、mode_Nというラベルの付いた別々のファイルを作成します。
- 対応する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