我使用一个名为 Gromacs 的软件。我使用以下命令:
g_bar -f md*.xvg -o -oi -oh
在终端中计算并打印结果。以下是屏幕截图:
我想将 DG 值存储在不同的变量或数组中。这些结果总是以 Lambda 开头。我想存储 DG 值,因为我正在编写一个程序,该程序会打印与所有 lambda 范围相关的信息。
所以我的程序打印
Lambda_Range = 0-0.05 distance= XXX force = XXX
我也想用它打印 DG 值
Lambda_Range = 0-0.05 distance= XXX force = XXX DG = XXX
我唯一能想到的办法是,如果我能以某种方式将 DG 值存储在数组或变量中。我想这样我就能实现我想要的了。
可以这样做吗?
答案1
您可以使用处理输出sed
并使用内置bash
函数mapfile
将输出读入数组:
mapfile -t a < <(g_bar -f md*.xvg -o -oi -oh | sed '/lambda/s/.*DG *//')
-t
:在将输入的每一行读入数组之前,删除其尾随的换行符a
:数组的名称< <(g_bar -f md*.xvg -o -oi -oh | sed '/lambda/s/.*DG *//')
:将运行的进程替换的输出重定向g_bar -f md*.xvg -o -oi -oh | sed '/lambda/s/.*DG *//'
到mapfile
stdin
这样,每个结果都将存储在数组中$a
。
ubuntu@ubuntu:~/tmp$ cat infile
lambda 0.000 - 0.000, DG -0.00 +/- 0.00
lambda 0.000 - 0.000, DG 0.01 +/- 0.09
lambda 0.000 - 0.000, DG -0.02 +/- 0.08
lambda 0.000 - 0.000, DG 0.03 +/- 0.07
lambda 0.000 - 0.000, DG -0.04 +/- 0.06
lambda 0.000 - 0.000, DG 0.05 +/- 0.05
lambda 0.000 - 0.000, DG -0.06 +/- 0.04
lambda 0.000 - 0.000, DG 0.07 +/- 0.03
lambda 0.000 - 0.000, DG -0.08 +/- 0.02
lambda 0.000 - 0.000, DG 0.09 +/- 0.01
ubuntu@ubuntu:~/tmp$ mapfile -t a < <(sed '/lambda/s/.*DG *//' infile)
ubuntu@ubuntu:~/tmp$ echo ${a[0]}
-0.00 +/- 0.00
ubuntu@ubuntu:~/tmp$ echo ${a[1]}
0.01 +/- 0.09
ubuntu@ubuntu:~/tmp$ echo ${a[2]}
-0.02 +/- 0.08
ubuntu@ubuntu:~/tmp$ for x in "${a[@]}"; do echo "$x"; done
-0.00 +/- 0.00
0.01 +/- 0.09
-0.02 +/- 0.08
0.03 +/- 0.07
-0.04 +/- 0.06
0.05 +/- 0.05
-0.06 +/- 0.04
0.07 +/- 0.03
-0.08 +/- 0.02
0.09 +/- 0.01