awk: печать между регулярными выражениями в разных столбцах - PullRequest
0 голосов
/ 28 февраля 2020

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

Run Summary Paddle Status = 613  (hex 265) Cd+Bi paddle
   Run     To      Time    Current    C mon       Ufis      Charge
                   (sec)    (uA)                             (uC)
  23626   35950   1797.5     99.0   5.641e+05   2.289e+06   1.779e+05
  23630   34587   1729.3    104.9   5.439e+05   2.234e+06   1.815e+05
  23634   34982   1749.1     92.8   5.526e+05   2.100e+06   1.623e+05
  23638   35950   1797.5     95.0   5.698e+05   2.204e+06   1.707e+05
  23642   36135   1806.8     99.6   5.710e+05   2.317e+06   1.800e+05
  23646   36130   1806.5    100.0   5.747e+05   2.322e+06   1.807e+05
  23650   36121   1806.0    100.2   5.733e+05   2.324e+06   1.810e+05
  23654   36123   1806.2    100.2   5.752e+05   2.323e+06   1.809e+05
   Sum  2418821 120941.1            3.772e+07   1.513e+08   1.193e+07

Run Summary Paddle Status = 357  (hex 165) Cd paddle
   Run     To      Time    Current    C mon       Ufis      Charge
                   (sec)    (uA)                             (uC)
  23625   36001   1800.0    100.8   3.342e+05   2.329e+06   1.814e+05
  23629   36132   1806.6    100.8   3.307e+05   2.343e+06   1.821e+05
  23633   35882   1794.1     97.6   3.565e+05   2.257e+06   1.751e+05
  23637   36139   1807.0     99.3   3.545e+05   2.307e+06   1.795e+05
  23641   36133   1806.7     99.3   3.598e+05   2.307e+06   1.794e+05
  23645   36144   1807.2     99.7   3.635e+05   2.315e+06   1.802e+05
  23649   36132   1806.6    100.1   3.648e+05   2.321e+06   1.808e+05
  23653   36123   1806.2    100.1   3.695e+05   2.318e+06   1.808e+05
  23657   36152   1807.6     99.9   3.684e+05   2.318e+06   1.805e+05
   Sum  2404062 120203.1            2.186e+07   1.505e+08   1.193e+07

Мне нужно распечатать первый столбец, который находится между двумя строками после регулярного выражения Cd+Bi, а первое вхождение Sum не включено. Затем то же самое будет повторяться для регулярного выражения Cd. Мой вывод будет тогда двумя файлами (хотя это не строго), которые будут иметь следующее содержимое

файл с Cd+Bi

23626   
23630 
23634  
23638  
23642   
23646  
23650  

файл с Cd

23625
23629
23633
23637
23641
23645
23649
23653
23657

Я пытался использовать следующие oneliners, но я не могу воспроизвести то, что я хочу.

  1. Это ничего не печатает awk '$9 ~ /Cd+Bi/, $1 ~ /Sum/' file
  2. Это печатает все строки, которые содержат сумму awk '$9 ~ /Cd+Bi/{flag=1;next}$1 ~ /Sum/' file

Есть идеи, как получить желаемый результат?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020
$ awk '$9=="Cd+Bi",$1=="Sum"{ if ($1 ~ /^[0-9]+$/) print $1 }' file
23626
23630
23634
23638
23642
23646
23650
23654

Обратите внимание, что последняя строка содержит 23654, который не был включен в ваш пример.

И для Cd:

$ awk '$9=="Cd",$1=="Sum"{ if ($1 ~ /^[0-9]+$/) print $1 }' file
23625
23629
23633
23637
23641
23645
23649
23653
23657
1 голос
/ 28 февраля 2020

Вот еще одно awk решение:

С Cd+Bi:

awk -v s='Cd+Bi' '$9==s{p=1} $1=="Sum"{p=0} p && $1+0 == $1{print $1}' file

23626
23630
23634
23638
23642
23646
23650
23654

и с Cd:

awk -v s='Cd' '$9==s{p=1} $1=="Sum"{p=0} p && $1+0 == $1{print $1}' file

23625
23629
23633
23637
23641
23645
23649
23653
23657
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...