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)에서 네 번째 열을 가져온 다음 다음 행의 첫 번째 열(이 경우 1.877)에서 가장 가까운 값을 찾고 싶습니다. 이것은 단지 참조용이며 일단 발견되면 두 번째 열이 0이 아닌 다음 행(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알고 싶다면, 데이터는 계산을 나타냅니다상태 밀도산화물 전자. 첫 번째 열은 전자의 에너지를 나타내고, 두 번째 열은 해당 에너지 준위의 전자 수를 나타냅니다. 따라서 가장 가까운 레벨 이후 "0.0000E+00"이 아닌 다음 값을 찾을 때페르미 에너지, 우리는 전자가 점프하여 전기를 전도하는 데 필요한 에너지를 계산할 수 있습니다. (금속은 밴드갭이 0이므로 전기를 전도하는 데 에너지 입력이 필요하지 않습니다.)

답변1

예제 출력이 부족하다는 점을 고려하면 이는 귀하의 요구 사항을 충족하는 것 같습니다.

awk 'NF == 3 && $2 != "0.0000E+00" { print $1 }' /path/to/input
1.726
1.877
4.152
4.303
4.455

실제로 요청하는 것이 두 번째 필드가 있는 마지막 행의 첫 번째 필드인 경우아니요(수학적으로) 0다음은 두 번째 필드의 기록입니다.(수학적으로) 0, 첫 번째 후속 레코드의 첫 번째 필드만 이어지며 두 번째 필드는 다음과 같습니다.아니요(수학적으로) 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

관련 정보