Как ограничить область в файле с помощью awk? - PullRequest
1 голос
/ 23 марта 2019

У меня длинный текстовый файл, и мне нужно предоставить вычисления для таблицы, которая находится в этом большом текстовом файле, поэтому я пытаюсь ограничить область и вывести только ту таблицу, которая мне нужна.Область, о которой я забочусь, выглядит следующим образом:

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 Ответ

2 голосов
/ 23 марта 2019

Обновление: в соответствии с вашим желаемым выходом, вы можете использовать это:

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

Другой пример, начиная с Кривая строки заголовка и до пустой строки:

$ 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:]]* * * * * * * * * * * * * * *1026* * * * * * * *1026* для строк, содержащих пробелы, если вы хотите строго говоря пустую строку, то просто /^$/, где ^ означает начало строки, а $ означает конец строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...