Вытяните несколько строк данных из 2 столбцов в нескольких местах

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

Используя приведенный ниже пример, мне нужно выяснить, есть ли способ вытащить все строки для первых двух столбцов данных, указанных ниже «ячейка». Я понимаю, что я могу продолжать копировать и вставлять getline; print $1,$2 getline; print $1,$2 но количество строк может варьироваться от 2 до 10000. Есть ли способ построить цикл, который будет считывать все строки, останавливаясь, когда он найдет текст или «=» вместо числа?

Ex. Набор данных:

  1tally 8 nps = 2000000000 particle(s): neutrons this tally is modified cell 20001 energy 0.0000E+00 0.00000E+00 0.0000 1.0000E-05 1.10650E-06 0.0213 1.0000E-03 1.15086E-04 0.0021 1.0000E-01 8.12322E-03 0.0002 1.9231E-01 3.65758E-03 0.0004 2.5000E+00 0.00000E+00 0.0000 total 1.60091E-02 0.0002 =================================================================================================================================== results of 10 statistical checks 1tally 38 nps = 2000000000 particle(s): neutrons this tally is modified cell 20001 energy 0.0000E+00 0.00000E+00 0.0000 1.0000E-05 1.10650E-06 0.0213 1.0000E-03 1.15086E-04 0.0021 1.0000E-01 8.12322E-03 0.0002 1.2400E-01 1.20892E-03 0.0006 1.4800E-01 1.00911E-03 0.0007 1.7200E-01 8.39342E-04 0.0008 1.9600E-01 6.99704E-04 0.0008 total 1.60091E-02 0.0002 =================================================================================================================================== results of 10 statistical checks 

Текущая попытка:

 /^1tally.*[0-9]/ {print $2}; /^ cell/ {getline; getline; print $1,$2} 

Ex. Выходной формат:

 8 0.0000E+00 0.00000E+00 1.0000E-05 1.10650E-06 1.0000E-03 1.15086E-04 1.0000E-01 8.12322E-03 1.9231E-01 3.65758E-03 2.5000E+00 0.00000E+00 38 0.0000E+00 0.00000E+00 1.0000E-05 1.10650E-06 1.0000E-03 1.15086E-04 1.0000E-01 8.12322E-03 1.2400E-01 1.20892E-03 1.4800E-01 1.00911E-03 1.7200E-01 8.39342E-04 1.9600E-01 6.99704E-04 

  • Сортировка файла на основе одного столбца с использованием Unix и Awk
  • удалить дублируемую запись из файла1, если запись присутствует в файле2
  • сравнивая первый столбец из двух файлов и печатая всю строку второго файла, если совпадают первые столбцы
  • Bash - Разбить предыдущие параметры команд
  • Почему значение $ 1 изменилось в `{$ total = $ total + $ 1}`?
  • Получение вывода egrep -o в одной строке
  • Как получить уникальные строки на основе значения столбца
  • Как преобразовать эти данные в назначения с помощью awk или другого?
  • One Solution collect form web for “Вытяните несколько строк данных из 2 столбцов в нескольких местах”

     # print lines from /energy/ to /total/, not inclusive awk '/total/{p=0};p;/energy/{p=1}' /path/to/input 

    Это просто установит, что awk установит p в 1, когда /energy/ будет видно, и установите p на 0, когда /total/ будет видно. Голый p (условие, которое запускает печать строк) будет тогда 1 на строках, которые вы хотите распечатать.

    Это можно уточнить, чтобы точно печатать данные, которые вы хотите:

     $ awk '/total/{p=0} p==1 {print $1,$2} /energy/{p=1}' input 0.0000E+00 0.00000E+00 1.0000E-05 1.10650E-06 1.0000E-03 1.15086E-04 1.0000E-01 8.12322E-03 1.9231E-01 3.65758E-03 2.5000E+00 0.00000E+00 

    Чтобы также напечатать второе поле, когда вы видите /1tally/ , просто добавьте конкретный триггер:

     $ awk '/1tally/ {print $2} /total/{p=0} p==1 {print $1,$2} /energy/{p=1}' input 8 0.0000E+00 0.00000E+00 1.0000E-05 1.10650E-06 1.0000E-03 1.15086E-04 1.0000E-01 8.12322E-03 1.9231E-01 3.65758E-03 2.5000E+00 0.00000E+00 

    Чтобы поместить пустую строку между каждым блоком outblock, используйте /total/{p=0; print ""} /total/{p=0; print ""}

    Linux и Unix - лучшая ОС в мире.