1

我正在使用高斯进行一些计算。从高斯输出文件中,我需要提取输入结构信息。输出文件包含 800 多个结构坐标。到目前为止,我所做的是,使用grep,awksed命令的某些组合收集所有输入坐标,如下所示:

grep -A 7 "Input orientation:" test.log | grep -A 5 "C" | awk '/C/{print "structure number"}1' | sed '/--/d' > test.out

这有助于我grep输入所有输入坐标并插入带有“结构编号”的行。所以现在我有一个文件,其中包含一个以常规方式重复的模式。该文件如下所示:

结构编号

4.176801 -0.044096 2.253823

2.994556 0.097622 2.356678

5.060174 -0.115257 3.342200

结构编号

4.180919 -0.044664 2.251182

3.002927 0.098946 2.359346

5.037811 -0.103410 3.389953

这里,“结构编号”被重复。我想按递增顺序写一个像“结构编号:1”、“结构编号 2”这样的数字。

我怎么解决这个问题?

提前感谢您的帮助。

4

1 回答 1

2

我对一个叫做 gaussian 的程序一点也不熟悉,所以我不知道原始输入是什么样子的。如果有人发布示例,我可能会提供更短的解决方案。

但是,据我所知,OP 对他/她的代码输出感到满意,除了他/她想在插入的行中添加越来越多的awk.

这可以通过以下行来实现(调整 OP 的代码):

grep -A 7 "Input orientation:" test.log | grep -A 5 "C" | awk '/C/{print "structure number"++i}1' | sed '/--/d' > test.out

附录:

即使不知道实际输入,我相信至少可以摆脱sed将那项工作留给awk. 此外,不需要引用单个字符的 grep 模式:

grep -A 7 "Input orientation:" test.log | grep -A 5 C | awk '/C/{print "structure number"++i}!/--/' > test.out

我不确定,因为我无法测试,但也应该可以让awk'grep工作。作为第一个猜测,我会尝试以下方法:

awk '/Input orientation:/{li=7}!li{next}{--li}/C/{print "structure number"++i;lc=5}!lc{next}{--lc}!/--/' test.log > test.out

虽然这在代码中可能会稍长一些,但它是一种awk仅在一个进程中完成所有工作的解决方案。如果我有输入进行测试,我可能会想出一个更短的解决方案。

于 2013-09-04T09:26:04.613 回答