非常に間違った形式のデータファイルがありますが、残念ながら結果ファイルの形式を変更することはできません。私はGAWKを使用してデータを管理可能な形式に解析しましたが、今ではレイアウトがわずかに異なる新しいファイルセットを持つようになりました。
以下の例を使用して、「セル」の下に表示されるデータの最初の2列のすべての行を抽出する方法があるかどうかを確認する必要があります。コピーを続けて貼り付けることができることはわかっていますが、getline; print $1,$2
行数は2から10,000までさまざまです。すべての行を読み、数字の代わりにテキストまたは「=」が見つかった場合に停止するループを作成する方法はありますか?
前任者。データセット:
1tally 8 nps = 2000000000
particle(s): neutrons
this tally is modified
cell 20001
energy
0.0000E+00 0.00000E+00 0.0000
1.0000E-05 1.10650E-06 0.0213
1.0000E-03 1.15086E-04 0.0021
1.0000E-01 8.12322E-03 0.0002
1.9231E-01 3.65758E-03 0.0004
2.5000E+00 0.00000E+00 0.0000
total 1.60091E-02 0.0002
===================================================================================================================================
results of 10 statistical checks
1tally 38 nps = 2000000000
particle(s): neutrons
this tally is modified
cell 20001
energy
0.0000E+00 0.00000E+00 0.0000
1.0000E-05 1.10650E-06 0.0213
1.0000E-03 1.15086E-04 0.0021
1.0000E-01 8.12322E-03 0.0002
1.2400E-01 1.20892E-03 0.0006
1.4800E-01 1.00911E-03 0.0007
1.7200E-01 8.39342E-04 0.0008
1.9600E-01 6.99704E-04 0.0008
total 1.60091E-02 0.0002
===================================================================================================================================
results of 10 statistical checks
現在の試み:
/^1tally.*[0-9]/ {print $2};
/^ cell/ {getline; getline; print $1,$2}
前任者。出力フォーマット:
8
0.0000E+00 0.00000E+00
1.0000E-05 1.10650E-06
1.0000E-03 1.15086E-04
1.0000E-01 8.12322E-03
1.9231E-01 3.65758E-03
2.5000E+00 0.00000E+00
38
0.0000E+00 0.00000E+00
1.0000E-05 1.10650E-06
1.0000E-03 1.15086E-04
1.0000E-01 8.12322E-03
1.2400E-01 1.20892E-03
1.4800E-01 1.00911E-03
1.7200E-01 8.39342E-04
1.9600E-01 6.99704E-04
答え1
# print lines from /energy/ to /total/, not inclusive
awk '/total/{p=0};p;/energy/{p=1}' /path/to/input
表示するときは1にawk
設定され、p
表示するときは0に設定されます。その後、ベアワイヤ(行印刷をトリガーする条件)が印刷したい行になります。/energy/
p
/total/
p
1
必要なデータを正確に印刷するように改善できます。
$ awk '/total/{p=0} p==1 {print $1,$2} /energy/{p=1}' input
0.0000E+00 0.00000E+00
1.0000E-05 1.10650E-06
1.0000E-03 1.15086E-04
1.0000E-01 8.12322E-03
1.9231E-01 3.65758E-03
2.5000E+00 0.00000E+00
表示されたときに2番目のフィールドも印刷するには、/1tally/
特定のトリガーを追加するだけです。
$ awk '/1tally/ {print $2} /total/{p=0} p==1 {print $1,$2} /energy/{p=1}' input
8
0.0000E+00 0.00000E+00
1.0000E-05 1.10650E-06
1.0000E-03 1.15086E-04
1.0000E-01 8.12322E-03
1.9231E-01 3.65758E-03
2.5000E+00 0.00000E+00
各アウトブロックブロック間に空白行を配置するには、次のようにします。/total/{p=0; print ""}