次のファイルからデータをインポートしようとしています。
6 6 1 0
0.1166667E+02 0.4826611E-09 0.4826611E-09 0.3004786E-09 0.5000000E-15
1.000000000000000E-004
CAR
system-001
10.51965443 -34.96542345 301 1.95329810 1.00000000
-15.558 0.1631E+01 0.1597E+02
-15.407 0.1661E+02 0.1779E+02
-15.255 0.4253E+01 0.1990E+02
-15.104 0.0000E+00 0.2000E+02
-14.952 0.0000E+00 0.2000E+02
-3.884 0.0000E+00 0.2000E+02
-3.732 0.0000E+00 0.2000E+02
-3.581 0.0000E+00 0.2000E+02
-3.429 0.0000E+00 0.2000E+02
-3.277 0.8214E-03 0.2000E+02
-3.126 0.3543E+00 0.2002E+02
1.726 0.1019E+01 0.4386E+02
1.877 0.5581E+00 0.4399E+02
2.029 0.0000E+00 0.4400E+02
2.181 0.0000E+00 0.4400E+02
2.332 0.0000E+00 0.4400E+02
2.484 0.0000E+00 0.4400E+02
2.636 0.0000E+00 0.4400E+02
2.787 0.0000E+00 0.4400E+02
2.939 0.0000E+00 0.4400E+02
3.090 0.0000E+00 0.4400E+02
3.242 0.0000E+00 0.4400E+02
3.394 0.0000E+00 0.4400E+02
3.545 0.0000E+00 0.4400E+02
3.697 0.0000E+00 0.4400E+02
3.849 0.0000E+00 0.4400E+02
4.000 0.0000E+00 0.4400E+02
4.152 0.6271E-01 0.4400E+02
4.303 0.4520E+01 0.4433E+02
4.455 0.5040E+01 0.4511E+02
私はいつも行6(この場合は1.95329810)から4番目の列を取得し、次の行の最初の列(この場合は1.877)に最も近い値を探したいと思います。これは参照用であり、一度見つかったら、2番目の列がゼロ以外の次の行(4.152)を抽出したいと思います。
だから私は1.95329810と4.152を出力として取得し、それを引くことで次のようになります。
band_gap=4.152-$fermi_energy
@DopeGhotiの答えを考慮して、ifステートメントで彼のコードを使用しました。
#!/bin/bash
fermi_energy=$(awk 'NR==6 {printf $4}' DOSCAR-62.4902421.st)
awk -f go.awk DOSCAR-62.4902421.st
ファイルの場所go.awk
:
BEGIN {
test=0
}
NF == 3 && test == 0 && $2 != "0.0000E+00" {
keptvalue=$1
}
NF == 3 && test == 0 && $2 == "0.0000E+00" {
#print keptvalue
test=1
}
NF == 3 && test == 1 && $2 != "0.0000E+00" {
if ( sqrt(($fermi_energy-$1)**2) < 0.5 )
{
print $1
test=0
}
}
しかし、これはawkスクリプトでbash変数を使用する正しい方法ではないと思います。
PD知りたいなら,データは計算を表す状態密度酸化物電子。第1列は電子のエネルギーを表し、第2列は対応するエネルギー準位の電子数を表す。したがって、最も近いレベル以降、「0.0000E+00」ではなく次の値を見つけるとフェルミエネルギー、我々は電子がジャンプして電気を伝導するために必要なエネルギーを計算することができます。 (金属はバンドギャップがゼロなので、電気を伝導するためにエネルギー入力は必要ありません。)
答え1
出力例が不足していることを考慮すると、これはあなたの要件を満たすようです。
awk 'NF == 3 && $2 != "0.0000E+00" { print $1 }' /path/to/input
1.726
1.877
4.152
4.303
4.455
実際に要求するのが、2番目のフィールドを持つ最後の行の最初のフィールドである場合いいえ(数学的に) 0はい以下は、2番目のフィールドの履歴です。はい(数学的に) 0、最初の後続レコードの最初のフィールドのみが続き、2 番目のフィールドは次のようになります。いいえ(数学的に)0..これはawk
比較的簡単なスクリプトでも達成できます。
$ cat go.awk
BEGIN {
test=0
}
NF == 3 && test == 0 && $2 != "0.0000E+00" {
keptvalue=$1
}
NF == 3 && test == 0 && $2 == "0.0000E+00" {
print keptvalue
test=1
}
NF == 3 && test == 1 && $2 != "0.0000E+00" {
print $1
test=0
}
$ awk -f go.awk input
1.877
4.152