if文と変数を処理するには、awkを使用してください。

if文と変数を処理するには、awkを使用してください。

次のファイルからデータをインポートしようとしています。

  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

関連情報