如何为重复模式指定编号

时间:2013-07-31 21:55:19

标签: sed awk grep design-patterns

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

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”的编号。

我该如何解决这个问题?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

然而,据我所知,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

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

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

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