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

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

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

  • Сортировка однозначно из строки
  • awk, чтобы вырезать часть поля и все еще печатать всю строку
  • Как извлечь строки пользовательского агента из файла журнала?
  • Вопрос о инструкциях конкатенации
  • как получить данные из результата grep?
  • сравните файл B с A и извлеките данные из A с помощью awk, sed или grep
  • 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 

  • Объедините два файла по очереди с символом тройного канала разделителя «|||»
  • Использование cut / awk / sed с двумя разными разделителями
  • Как awk разрезать определенные поля и добавить к концу каждой строки?
  • разбивать файл на несколько частей
  • подстановка команды внутри 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 - лучшая ОС в мире.