如何使用awk严格控制文件中的区域?

如何使用awk严格控制文件中的区域?,awk,Awk,我有一个很长的文本文件,我需要在这个大的文本文件中提供一个表来进行计算,所以我试图限制区域并只打印我需要的表。我关心的区域如下所示: Sums of squares of residuals for separate curves, including only individual weights Curve No. of obs. Sum of squares 1 82 0.20971070 2 7200 136

我有一个很长的文本文件,我需要在这个大的文本文件中提供一个表来进行计算,所以我试图限制区域并只打印我需要的表。我关心的区域如下所示:

Sums of squares of residuals for separate curves, including only individual weights


Curve     No. of obs.   Sum of squares
  1           82        0.20971070
  2         7200    13659.50038631
  3         7443    15389.87972458
  4         5843    10510.37305696
  5          290    49918.40634886
  6         1376    49974.57509390
  7          694     8340.44771461
  8          545     2476.43037281
  9          349     1425.69687357



 1111 1111 0101110 01110 11001 01111 11110 0 1 1 0.100D-02


   UNWEIGHTED OBSERVATIONAL EQUATIONS
No.  Curve    Input Param.        Correction     Output Param.    Standard Deviation
 9      0     39.6398000000      0.0796573846     39.7194573846      0.6864389887
我试过了,但所有的文件都打印出来了

/Curve/ { in_f_format=0; next }
/UNWEIGHTED/ { in_f_format=1; next }
{print}
期望输出

  1           82        0.20971070
  2         7200    13659.50038631
  3         7443    15389.87972458
  4         5843    10510.37305696
  5          290    49918.40634886
  6         1376    49974.57509390
  7          694     8340.44771461
  8          545     2476.43037281
  9          349     1425.69687357

更新:根据您想要的输出,您可以使用:

awk '/Curve/ { in_f_format=1; next } /^[[:space:]]*$/ { in_f_format=0; next } in_f_format'
如果您只需要两种模式之间的内容,请将代码更改为:

/Curve/ { in_f_format=1; next }
/UNWEIGHTED/ { in_f_format=0; next }
in_f_format {print}
块之前的内容被视为条件,当条件的计算结果为
true
,则将执行它之后的块。
默认情况下,将执行没有条件的块(当未被
next
或其他内容跳过时)。
此外,没有块的条件将隐含
{print}
,因此可以保存在此处

例如,
文件
,其中包含您提供的内容:

$ awk '/Curve/ { in_f_format=1; next } /UNWEIGHTED/ { in_f_format=0; next } in_f_format' file
  1           82        0.20971070
  2         7200    13659.50038631
  3         7443    15389.87972458
  4         5843    10510.37305696
  5          290    49918.40634886
  6         1376    49974.57509390
  7          694     8340.44771461
  8          545     2476.43037281
  9          349     1425.69687357



 1111 1111 0101110 01110 11001 01111 11110 0 1 1 0.100D-02
另一个示例,从曲线标题行开始到空行之前:

$ awk '/Curve/ { in_f_format=1; } /^[[:space:]]*$/ { in_f_format=0; next } in_f_format' file
Curve     No. of obs.   Sum of squares                                                      
  1           82        0.20971070                                                          
  2         7200    13659.50038631                                                          
  3         7443    15389.87972458                                                          
  4         5843    10510.37305696                                                          
  5          290    49918.40634886                                                          
  6         1376    49974.57509390                                                          
  7          694     8340.44771461                                                          
  8          545     2476.43037281                                                          
  9          349     1425.69687357        
默认情况下,未分配变量具有
0
或空值,其计算结果为
false


[[:space:][]*
用于有空格字符的行,如果严格来说您想要空行,那么只需
/^$/
,其中
^
表示行开始,
$
表示行结束。

非常感谢。我没有注意到,在一个原始的大文件中,这个表后面也是字符串“Curve”。是否有可能限制以
/Curve/{in_f_format=1;next}
开始并以空行结束的区域,在本例中,空行紧跟在第9行之后?@LukášAltman删除此块中的
next
,并在其他块的条件下更改正则表达式即可。i、 e.将
/UNWEIGHTED/
更改为
/^[:space:]*$/
awk'NF==3&&$1~/^[0-9]/'文件