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

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 ""}

  • объединить несколько строк данных, имеющих одно общее поле
  • exit awk, если вход отсутствует
  • Как напечатать максимальное значение, если оно выше, сравните с медианным значением других, используя большой набор данных
  • Awk / sed: добавить номера строк в текст из диапазона
  • Присоедините линию рисунка и последовательные непустые строки, разделенные запятыми и заключенные в ()
  • Номер одной строки в каждом текстовом файле
  • awk, чтобы изменить аналогичные строки
  • Удалите несколько запятых из определенного столбца файла с разделителями табуляции и распечатайте слова на новой строке
  • Как выделить данную строку в данном месте?
  • Извлечение значений из простого файла html через grep / awk
  • как запустить awk дважды в одном файле
  • Сравнивая File1 и File2, чтобы прокомментировать соответствующий шаблон в File2
  • Interesting Posts

    Как пропустить специальные / сокетные файлы во время передачи rsync?

    Мне нужна помощь с командой «at»

    Установите Puppy Linux или «Damn Small Linux» на Pogoplug (~ NSLU2)

    Как изменить разрешение файла jar точно так же, как и другой файл jar machine?

    Использование Putty / plink для scp для именованного канала

    Какая версия split поддерживает флаг -p?

    Любой способ синхронизации структуры каталогов, когда файлы уже с обеих сторон?

    Установка плагина gedit на Fedora

    Разделить файл по строке, удалив первое поле и используя его как имя для получаемой части

    Извлечь все до строки соответствия

    Есть ли файл журнала для команды find?

    Как перенести существующую систему Linux в раздел LVM

    Как автоматически смонтировать USB-флэш-диск с простой зашифровкой на моем маршрутизаторе OpenWRT?

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

    У моего Ubuntu 14.04 LTS нет звука

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