Хобрук: Ваш путь к мастерству в программировании

Как вставить две строки для каждого фрейма данных с помощью awk?

У меня есть повторяющиеся данные следующим образом

....
 4 4 4 66 79 169 150 0  40928  40938  40923  40921  40789  40000  40498
 5 4 3 16 22 247 0  40168  40911  40944  40205  40000  40562
 6 4 4 17 154 93 309 0  40930  40919  40903  40917  40852  40000  40419
 7 3 2 233 311 0  40936  40932  40874  40000  40807
....

Эти данные состоят из 115 блоков данных, и каждый блок данных имеет 4000 строк, подобных этому формату. Здесь я надеюсь поместить две новые строки (количество строк в блоке данных = 4000 и пустая строка) в начале каждого блока данных, чтобы это выглядело

4000

 1 4 4 244 263 704 952 0  40936  40930  40934  40921  40820  40000  40570
 2 4 4 215 172 305 33 0  40945  40942  40937  40580  40687  40000  40410
 3 4 4 344 279 377 1945 0  40933  40915  40907  40921  40839  40000  40437
 4 4 4 66 79 169 150 0  40928  40938  40923  40921  40789  40000  40498
...
 3999 2 2 4079 4081 0  40873  40873  40746  40000  40634
 4000 1 1 4080 0  40873  40923  40000  40345
4000

 1 4 4 244 263 704 952 0  40936  40930  40934  40921  40820  40000  40570
 2 4 4 215 172 305 33 0  40945  40942  40937  40580  40687  40000  40410
 3 4 4 344 279 377 1945 0  40933  40915  40907  40921  40839  40000  40437
 4 4 4 66 79 169 150 0  40928  40938  40923  40921  40789  40000  40498
... 

Могу ли я сделать это с помощью awk или любой другой команды unix?

12.10.2014

Ответы:


1

Простой лайнер с использованием awk может решить эту задачу.

awk 'NR%4000==1{print "4000\n"} {print$0}' file

что оно делает.

print $0 печатает каждую строку. NR%4000==1 выбирает 4000 строку. Когда это происходит, он печатает 4000 и новую строку \n, то есть две новые строки.

NR Количество записей, т. е. количество строк, прочитанных на данный момент.

простой тест.

вставляет 4000 на 5-й строке

awk 'NR%5==1{print "4000\n"} {print$0}'

выход:

4000

1
2
3
4
5
4000

6
7
8
9
10
4000

11
12
13
14
15
4000

16
17
18
19
20
4000
12.10.2014
  • Не могли бы вы сравнить первые три строки вашего вывода с первыми тремя строками примера требования? Ваш один вкладыш должен был быть написан как NR%4000==1{print "4000\n} 1, чтобы заголовок печатался перед печатью строк #1, #4001, #8001 и т. д. 12.10.2014
  • Это NR%4000==1{print "4000\n"} 1 (с открывающей и закрывающей двойной кавычкой...). 12.10.2014
  • @gboffi ты меня понял. Исправлено. Спасибо :) 12.10.2014
  • Я вижу еще два небольших дефекта... (1) аргумент file в вашей первой строке кода нуждается в пробеле, чтобы быть отделенным от программы awk, и (2) вы забыли обновить описание своего алгоритма, описание, которое все еще относится к ваша предыдущая реализация. 13.10.2014

  • 2

    Мое решение является более общим, поскольку блоки могут иметь неравную длину, если вы перезапустите счетчик 1-го поля, чтобы обозначить начало нового блока.

    % cat mark_blocks
    $1<count { print count; print "";
               for(i=1;i<=count;i++) print l[i]; }
    # executed for each line
             { l[$1] = $0; count=$1}
    END      { print count; print "";
               for(i=1;i<=count;i++) print l[i]; }
    % awk -f mark_blocks your_data > marked_data
    % 
    

    Работа проста, awk накапливает строки в памяти и печатает строки заголовка и накопленные данные, когда достигает нового блока или EOF.

    (Скромный) трюк заключается в том, что действие вывода должно иметь место до того, как мы выполним обычные действия, которые мы делаем для каждой строки.

    12.10.2014

    3

    Вы можете сделать все это в bash:

    cat $FILE | ( let countmax=4000; let count=countmax; while read lin ; do if [ $count == $countmax ]; then let count=0; echo -e "$countmax\n" ; fi ; echo $lin ; let count=count+1 ; done )
    

    Здесь мы предполагаем, что вы читаете эти данные из $FILE. Затем все, что мы делаем, это читаем из файла и передаем его в наш маленький скрипт bash.

    Сценарий bash читает строки одну за другой (с while read lin) и увеличивает счетчик count для каждой строки. При запуске или когда счетчик count достигает значения countmax (установленного на 4000), он распечатывает 2 строки, которые вы просили.

    12.10.2014
  • Спасибо, но это дает мне еще две пустые строки, а не 1 пустую строку. Таким образом, этот код приводит к 3 дополнительным строкам. 12.10.2014
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..