如何在bash脚本中使用命令读取文件中的多行并选择一个数字来定义变量

时间:2018-05-25 07:46:35

标签: bash shell

我一直在尝试使用bash脚本编写代码来读取file1.dat并查找特定数字并将其指定给变量。

例如,在file1.dat中,

10  10   1   0
0.8499360E+02  0.6965500E-09  0.6965500E-09  0.2022791E-08  0.5000000E-15
1.000000000000000E-004
CAR
HgRO
5.26290852    -15.00879477  301     -1.68859640      1.00000000
-15.009  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
-14.941  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
-14.874  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
-14.806  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
--////////-----/////---

从上面的文件中我只想读取数字-1.68859640并声明一个变量" EFERMI"在剧本中。

所以,代码看起来应该是,

EFERMI=$(head -n +6 ../DOSCAR | tail -1)

但这个命令整行的问题来了。

那么,请你帮我找到正确的命令。

3 个答案:

答案 0 :(得分:2)

您可以尝试使用awk

EFERMI=$(awk 'NR==6{print $4}' file1.dat)

NR是记录号(行号),$4是该行的第4个元素。

答案 1 :(得分:1)

在您获得所需号码的行之后,您可以使用read从中提取所需的号码。如果它在该行中具有固定位置作为单词,则可以简单地跳过所需数量的单词,如下所示:

infile="../DOSCAR"
LINE="$(head -n +6 "$infile" | tail -1)"
read _ _ _ _ _ _ EFERMI _ <<<"$LINE"

您可以(也可能应该)阅读文件的其他部分并检查格式和内容,以确保您获得了正确的输入和正确的数字。

答案 2 :(得分:0)

Zrin已经提供了一种解决方案。以下是其他人:

使用cut,您可以选择任何字段,前提是您知道字段编号:

EFERMI=$(head ....|tail ....|cut -d ' ' -f 7)

如果你不知道字段编号,但知道它是最后一个字段,你可以做一个

EFERMI=$(LINE##* }

其中 LINE 与Zrin的解决方案一样。这假设LINE没有尾随空格。当然,在提取字段之前,您始终可以删除尾随空格。