다음과 같은 파일에서 데이터를 가져오려고 합니다.
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