Awk提取文本字符串之间的数据块

时间:2014-04-07 16:35:54

标签: awk

我再次使用awk从日志文件中提取数据。我的日志文件中的区域看起来像这样,但是在这个块的上方和下方有几千行:

4C*DJ - (B-C)*DJK + 2*(2A+B+C)*D1 - 4*(4A+B-3C)*D2 = 0
Value =     0.5293955920D-22

Alpha Matrix in cm-1
Axis Mode    Inertia        Coriol.        Anharm.        Total
x    1   -0.37699D-03   -0.36413D-02    0.10830D-01    0.68121D-02
x    2   -0.83656D-03   -0.53163D-02    0.14483D-01    0.83306D-02
x    3   -0.15253D-02   -0.10512D-01    0.20064D-01    0.80264D-02
x    4   -0.17103D-03   -0.73492D-03    0.14953D-01    0.14047D-01
x    5   -0.96312D-03   -0.11748D-01    0.15825D-02   -0.11128D-01
x    6   -0.46095D-03   -0.94225D-02    0.44165D-02   -0.54669D-02
x    7   -0.26926D-01   -0.10167D-01    0.29406D-01   -0.76866D-02
x    8   -0.17827D-02   -0.21079D-01    0.74564D-02   -0.15405D-01
x    9   -0.55840D-02    0.84897D-01   -0.29596D-02    0.76354D-01
x   10   -0.50287D-24    0.36312D-01   -0.44078D-02    0.31904D-01
x   11   -0.48777D-24   -0.63320D-01    0.18876D-02   -0.61432D-01
x   12   -0.35364D-24    0.42877D-01    0.62352D-03    0.43500D-01
y    1   -0.23141D-05   -0.13777D-03    0.53278D-03    0.39270D-03
y    2   -0.62128D-05   -0.87905D-04    0.36602D-03    0.27190D-03
y    3   -0.55613D-05   -0.33722D-04    0.28874D-03    0.24946D-03
y    4   -0.47995D-04   -0.60863D-03    0.17426D-02    0.10860D-02
y    5   -0.36076D-04   -0.20493D-03    0.12026D-03   -0.12075D-03
y    6   -0.12725D-03   -0.61930D-03   -0.15830D-03   -0.90485D-03
y    7   -0.19917D-03   -0.55423D-04    0.10520D-02    0.79740D-03
y    8   -0.48978D-03   -0.13733D-02    0.54899D-03   -0.13141D-02
y    9   -0.11432D-02    0.62058D-03   -0.20074D-04   -0.54272D-03
y   10   -0.16078D-24    0.20852D-02   -0.88466D-04    0.19967D-02
y   11   -0.63877D-25    0.18274D-03   -0.13682D-03    0.45922D-04
y   12   -0.43257D-25    0.92039D-03   -0.61669D-03    0.30370D-03
z    1   -0.69174D-07   -0.23737D-03    0.59290D-03    0.35547D-03
z    2   -0.60773D-05   -0.18704D-03    0.53271D-03    0.33960D-03
z    3   -0.46425D-05   -0.29722D-03    0.57403D-03    0.27217D-03
z    4   -0.22234D-04   -0.47670D-03    0.15748D-02    0.10759D-02
z    5   -0.20254D-04    0.24124D-03    0.11848D-03    0.33947D-03
z    6   -0.42788D-04    0.99264D-04   -0.40246D-04    0.16230D-04
z    7   -0.10941D-03    0.30020D-03    0.13135D-02    0.15043D-02
z    8   -0.19997D-03    0.32196D-03    0.54501D-03    0.66699D-03
z    9   -0.20819D-03    0.45666D-03   -0.67765D-04    0.18071D-03
z   10   -0.55249D-25    0.00000D+00   -0.14491D-03   -0.14491D-03
z   11   -0.55828D-26    0.00000D+00   -0.69139D-04   -0.69139D-04
z   12   -0.26265D-26    0.00000D+00   -0.45200D-03   -0.45200D-03

Vibro-Rot alpha Matrix (cm-1)
            a(z)           b(x)           c(y)
Q( 1)        0.00681        0.00039        0.00036

我需要从(在这种情况下)“x 1 -0.37 ......”到“z 12 -0.262 ......”中提取数据

如果我可以获取awk将数据提取到某个已知点,我可以对文件进行排队和尾随。我有大约300个这些文件,每个文件都有不同的行数,所以我不能只计算行数,但它们都以“Axis Mode Inertia ...”开头,以“Vibro-Rot alpha Matrix”结束。

我目前正在尝试使用:

awk '$1=="Axis"&&$2=="Mode"{t=1};t;/[0-9]+ "Vibro-Rot alpha Matrix"/{exit}' file.log

这可以获得文件的开头(虽然它包含我随后可以切断的标题)。但是awk命令的结尾部分不起作用。我试图用^ Vib / {exit}和其他东西来结束它,但似乎没有任何工作,我只是在我做的时候得到几千行的日志文件。

我确信这很重要,顶部的“轴”之前和文件底部的“Vibro-Rot”之前有一个空格。虽然“$ 1 ==”Axis“&& $ 2 ==”Mode“”部分似乎并不关心单个空格。

我错过了什么,直到其中包含“Vibro-Rot alpha Matrix”的行?

提前致谢!

3 个答案:

答案 0 :(得分:0)

尝试类似:

awk '!NF{p=0}p; /Axis Mode/{p=1}' file.log

- 使用您的原始方法: 怎么样:

awk '/Vibro-Rot alpha Matrix/{exit}t; $1=="Axis"&&$2=="Mode"{t=1}' file.log

答案 1 :(得分:0)

它对我有用:

awk '$1 == "Axis" && $2 == "Mode" {t = 1;} $1 == "Vibro-Rot" && $2 == "alpha" && $3 == "Matrix" {t = 0;} t == 1 && NF == 6 {print $0}' file.log

如果您不想要标题,请尝试:

awk '$1 == "Vibro-Rot" && $2 == "alpha" && $3 == "Matrix" {t = 0;} t == 1 && NF == 6 {print $0} $1 == "Axis" && $2 == "Mode" {t = 1;}' file.log

答案 2 :(得分:0)

咦?使用grep:

egrep "^x|^y|^z" yourfile