AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 427051
Accepted
Joshua Salazar
Joshua Salazar
Asked: 2018-02-28 15:44:49 +0800 CST2018-02-28 15:44:49 +0800 CST 2018-02-28 15:44:49 +0800 CST

在 awk 脚本中使用 if 和 shell 变量

  • 772

我正在尝试从如下文件中获取数据:

  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)中查找其最接近的值。仅用于参考,在创建之后,我想提取其第二列非零(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”值时,我们可以计算出使电子跳跃并导电所需的能量。(金属的带隙为零,因此它们不需要能量输入来导电)

awk data
  • 2 2 个回答
  • 435 Views

2 个回答

  • Voted
  1. Best Answer
    user1404316
    2018-02-28T19:12:55+08:002018-02-28T19:12:55+08:00

    下面的答案对您的技术进行了许多更改。

    1. 在一个awk程序而不是两个程序中完成所有操作。您可以这样做,因为您的第二次运行仅处理第 6 行之后的行:

    2. 从第 6 行正确分配您的 fermi_energy 值。

    3. 不再需要检查,NF==3因为第 6 行之后的所有行都满足该标准。

    4. 消除 variable ,取而代之的是,让我们保留和test之间最小差异的运行选项卡。为此,我们将创建一个变量,该变量最初的值非常大,保证第一次测试失败。在测试文件的所有行之后,我们还将为其他变量分配易于理解的名称,并仅打印一个结果。fermi_energy$1min

    5. 用计算量少的零测试代替计算量大的绝对值测试。

    6. 注意awk支持浮点科学计数法。例如,在printf命令中,可以使用格式%E. 像往常一样,查看man页面或您最喜欢的搜索引擎了解更多信息。

    7. 所有这些都是在不了解粒子物理学的情况下完成的,所以我可能有一些不正确的地方。赦免。如果是这样,我希望至少这能让你走上正轨。

      awk '
          BEGIN  { min=1000 ; jump_energy="INIT" }
          function abs(v) {return v < 0 ? -v : v}
          NR==6 {fermi_energy=$4}
          NR>6 {
              if (jump_energy != 0) {
                  this_diff=abs(fermi_energy-$1)
                  if (this_diff < min) {
                      min=this_diff
                      energy_level=0
                      jump_energy=0
                      getline
                  }
              }
              if (jump_energy == 0  && $2 != "0.0000E+00") {
                  energy_level=$1
                  jump_energy=$2
              }
          }
          END {
              printf "  Fermi Energy: %f\n  Energy Level: %f\n  Jump Energy: %E\n", fermi_energy, energy_level, jump_energy
          }'
      
    • 3
  2. Kusalananda
    2018-03-07T01:53:41+08:002018-03-07T01:53:41+08:00
    awk 'NR == 6 { fe = $4 }
         NR > 6 && $1 > fe && $2 > 0 { print fe, $1; exit }' file
    

    对于给定的输入数据,file这将产生

    1.95329810 4.152
    

    该awk脚本忽略前五行输入。在第六行,它挑选出第四个字段并将其分配给变量fe(简称“费米能量”。

    然后代码假定第一列中的值正在增加,并且当这些第一列值中的第一列值达到高于存储在中的值的值时fe,如果第二列非零,则打印出第一列中fe的值列并退出。

    不幸的是,我不完全理解您较长的代码段,因为没有解释您实际想要它做什么。

    • 0

相关问题

  • 根据第一个逗号之前的匹配删除重复行数

  • 在另一个文件之后逐行追加行

  • 如何删除两行之间的单行

  • 重新排列字母并比较两个单词

  • 多行文件洗牌

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve