Вытяните несколько строк данных из 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 

  • Тестирование регулярного выражения из stdin с помощью grep | sed | awk
  • предельные выходы awk
  • Разделить текстовый файл на несколько файлов по содержимому столбца
  • Заменить поля в файле inline
  • Как напечатать определенные поля, если выполнено условие
  • Как найти конкретную строку и распечатать всю строку?
  • Как сделать поиск нескольких строк с использованием awk в unix?
  • Regex awk для интерфейса Cisco
  • 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 ""}

    Interesting Posts

    Есть ли хорошо известные и хорошо используемые среды сценариев IDE для Un * x?

    Настройки Vim в редакторе ncftp

    Centos 6.5 от настольного компьютера до базового сервера

    Существует ли приложение терминала, позволяющее щелчкам имен файлов?

    Как измерить потребление энергии на USB-устройстве?

    Как я могу узнать, является ли относительная символьная ссылка внутренней для определенного поддерева или нет?

    Как часто Debian обновляет свой стабильный репозиторий?

    открытие ошибки kcheckpass / var / log / faillog

    Начать Vim как мой пользователь с привилегиями root

    Почему я не могу установить пакет разработки ncurses?

    Как помнить разницу между du и df?

    Сенсорная панель распознана как универсальная мышь ImPS / 2

    после замены материнской платы Debian получает пустой экран во время загрузки

    bash добавление 1 к переменной в цикле while

    Замените неисправный жесткий диск на debian

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