如何使用awk限制文件中的区域?

时间:2019-03-23 05:34:47

标签: 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    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

1 个答案:

答案 0 :(得分:2)

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

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},因此可以在此处保存。

例如,file包含您提供的内容:

$ 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

另一个示例,从 Curve 标题行到空行之前:

$ 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:]]*用于具有空格字符的行,如果您要严格地说是空行,则只需/^$/,其中^表示行头,$表示行尾。 / p>