別のシミュレーションを実行するための入力として準備するために再フォーマットする必要があるシミュレーションファイルからデータを抽出したいと思います。ターゲットデータは最適化された化学物質です。z行列。リンクの例と唯一の違いは、数値が z 行列の下に変数として格納されることです。
私が作業しているファイルは、数千から数十万の行にまたがり、ターゲットデータに非常に似ている他の中間z行列を含むことができます。ただし、必要なデータの後には独自の先行行と行があるため、これら2行間のデータは比較的簡単に抽出できます。例は次のとおりです。
Final structure in terms of initial Z-matrix:
Cl
C,1,B1
C,2,B2,1,A2
H,2,B3,1,A3,3,D3,0
H,2,B4,1,A4,3,D4,0
C,3,B5,2,A5,1,D5,0
C,6,B6,3,A6,2,D6,0
C,7,B7,6,A7,3,D7,0
H,3,B8,2,A8,1,D8,0
H,3,B9,2,A9,1,D9,0
H,7,B10,6,A10,3,D10,0
H,7,B11,6,A11,3,D11,0
H,8,B12,7,A12,6,D12,0
H,8,B13,7,A13,6,D13,0
H,8,B14,7,A14,6,D14,0
O,6,B15,3,A15,2,D15,0
Variables:
B1=1.81746475
B2=1.52136867
A2=110.80057513
B3=1.0898967
A3=106.92512231
D3=-121.94499481
B4=1.08989406
A4=106.92581701
D4=121.94497834
B5=1.52808963
A5=111.92359259
D5=179.99770382
B6=1.523193
A6=116.49970868
D6=179.97424974
B7=1.52739317
A7=113.56269053
D7=179.98802896
B8=1.09816794
A8=110.50682514
D8=58.2854688
B9=1.09816384
A9=110.50888758
D9=-58.28349045
B10=1.10022643
A10=107.84652382
D10=56.40290615
B11=1.10022793
A11=107.84460667
D11=-56.42958848
B12=1.09398015
A12=110.97242167
D12=-59.62466169
B13=1.09473047
A13=110.53459142
D13=179.99742235
B14=1.09397826
A14=110.9720435
D14=59.61905862
B15=1.21736254
A15=121.22780588
D15=-0.02140167
1\1\GINC-C0959\FOpt\RB3LYP\6-31G(d)\C5H9Cl1O1\SKYLERS\10-Sep-2013\0\\#
また、このデータの書式を再指定し、最初のセクションのカンマをスペースで置き換える必要があり、変数は左にインデントされた文字と右にインデントされた数字で構成される必要があります。また、入力ファイル名に基づいてこのデータを新しいファイルに書き込むようにこのスクリプトを設定したいと思います。
私の目標は次のように要約されます。
- abc.outファイルを開きます。
- 「初期 Z 行列の最終構造:」 以降の読み取りを開始します。
- Z 行列の書式を再指定します。
- 変数型の変更
- abc.cmファイルに書き込む
これまで私が使用を検討しているawkの部分は次のとおりです。
{FS=","};{OFS=" "};{print $0}
{FS="="};{printf "%-4s%13.8f", $1, $2}
私がまだ把握していないのは次のとおりです。
- 入力ファイル名に基づいてファイルを作成する方法は?
- 最初の行と最後の行の間の内容だけを読むにはどうすればよいですか?
- 「Variable:」でどのように分割する必要がありますか?
ベストアンサー1
デフォルトでは、小さなステートマシンを作成します。
awk '
BEGIN {
FS = ","
OFS = " " # this is the default
}
# create the output file name
# on the first line of the input, the FILENAME variable will be populated
FNR == 1 {
f = FILENAME
sub(/\.out/,".cm",f)
}
# I assume this is the magic closing line.
# All the backslashes and regular-expression metacharacters
# have to be backslash-escaped
/1\\1\\GINC-C0959\\FOpt\\RB3LYP\\6-31G\(d\)\\C5H9Cl1O1\\SKYLERS\\10-Sep-2013\\0\\\\#/ {
print "got end"
exit
}
started && /Variables:/ {
variables = 1
FS = "="
next
}
started && !variables {
# do stuff with comma-separated lines
# rewrite the file using space as separator
# this looks weird, but it forces awk to re-write the line using OFS
$1 = $1
print > f
}
started && variables {
# do stuff with "="-separated lines
# the FS here is "=", so there should be 2 fields.
printf "%-5s %15.8f\n", $1, $2 > f
}
!started && /Final structure in terms of initial Z-matrix/ {
started = 1
}
' abc.out
入力内容に応じて「abc.cm」ファイルが生成されます。
Cl
C 1 B1
C 2 B2 1 A2
H 2 B3 1 A3 3 D3 0
H 2 B4 1 A4 3 D4 0
C 3 B5 2 A5 1 D5 0
C 6 B6 3 A6 2 D6 0
C 7 B7 6 A7 3 D7 0
H 3 B8 2 A8 1 D8 0
H 3 B9 2 A9 1 D9 0
H 7 B10 6 A10 3 D10 0
H 7 B11 6 A11 3 D11 0
H 8 B12 7 A12 6 D12 0
H 8 B13 7 A13 6 D13 0
H 8 B14 7 A14 6 D14 0
O 6 B15 3 A15 2 D15 0
B1 1.81746475
B2 1.52136867
A2 110.80057513
B3 1.08989670
A3 106.92512231
D3 -121.94499481
B4 1.08989406
A4 106.92581701
D4 121.94497834
B5 1.52808963
A5 111.92359259
D5 179.99770382
B6 1.52319300
A6 116.49970868
D6 179.97424974
B7 1.52739317
A7 113.56269053
D7 179.98802896
B8 1.09816794
A8 110.50682514
D8 58.28546880
B9 1.09816384
A9 110.50888758
D9 -58.28349045
B10 1.10022643
A10 107.84652382
D10 56.40290615
B11 1.10022793
A11 107.84460667
D11 -56.42958848
B12 1.09398015
A12 110.97242167
D12 -59.62466169
B13 1.09473047
A13 110.53459142
D13 179.99742235
B14 1.09397826
A14 110.97204350
D14 59.61905862
B15 1.21736254
A15 121.22780588
D15 -0.02140167