Нужна помощь в обработке текстового файла с awk для соответствия формату файлов CSV

У меня есть следующая проблема. Я собрал данные о времени реакции от более чем 100 участников для эксперимента, который я запускаю. К сожалению, разделители между полями были непротиворечивыми, но после тяжелой боли с sed мне удалось решить эту проблему.

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

Вот пример моего файла данных:

Participant: 2456, Test: Optimism IAT. Format is stimulus , correct(1)/incorrect(0) , time(ms). Writes 10 trials per line. 17/01/2011, 12:46:03 , Block 1: , Theirs , 1 , 1921 , Myself , 1 , 928 , Them , 1 , 716 , Theirs , 1 , 720 , Myself , 1 , 533 , Me , 1 , 596 , Themselves , 1 , 527 , Myself , 1 , 656 , Mine , 1 , 551 , Myself , 1 , 624 , Themselves , 1 , 570 , Me , 1 , 514 ,Block 1 Time,: 8856 , Block 2: , Failing , 1 , 1835 , Happy , 1 , 1118 , Sad , 1 , 673 , Succeeding , 1 , 690 , Improving , 1 , 795 , Succeeding , 1 , 602 , Worse , 1 , 586 , Succeeding , 1 , 553 , Improving , 1 , 619 , Disimproving , 1 , 659 , Succeeding , 1 , 596 , Failing , 1 , 539 ,Block 2 Time,: 9265 , Block 3: , Succeeding , 1 , 2881 , Disimproving , 1 , 1072 , Mine , 1 , 1120 , Me , 1 , 627 , Happy , 1 , 669 , Theirs , 1 , 1539 , Worse , 1 , 841 , Me , 1 , 862 , Sad , 1 , 1370 , Succeeding , 1 , 1115 , Worse , 1 , 855 , Theirs , 1 , 792 , Them , 1 , 627 , Better , 1 , 735 , Me , 1 , 626 , Happy , 1 , 622 , Succeeding , 1 , 616 , Mine , 1 , 646 , Them , 1 , 599 , Disimproving , 1 , 607 , Better , 1 , 799 , Myself , 1 , 1408 , Me , 1 , 463 , Better , 1 , 839 , Failing , 1 , 602 , Mine , 1 , 633 , Better , 1 , 525 , Sad , 1 , 573 , Worse , 1 , 770 , Me , 1 , 508 , Theirs , 1 , 613 , Disimproving , 1 , 649 , Improving , 1 , 701 , Theirs , 1 , 590 , Disimproving , 1 , 716 , Better , 1 , 714 ,Block 3 Time,: 29924 , Block 4: , Them , 1 , 1659 , Myself , 1 , 1036 , Themselves , 1 , 595 , Me , 1 , 509 , Myself , 1 , 648 , Themselves , 1 , 542 , Myself , 1 , 536 , Mine , 1 , 537 , Theirs , 1 , 615 , Mine , 1 , 520 , Me , 1 , 596 , Mine , 1 , 471 ,Block 4 Time,: 8264 , Block 5: , Mine , 1 , 1527 , Myself , 1 , 1235 , Disimproving , 0 , 2001 , Theirs , 1 , 981 , Succeeding , 1 , 1994 , Happy , 1 , 1454 , Failing , 1 , 1941 , Theirs , 1 , 1151 , Failing , 0 , 1358 , Me , 1 , 790 , Failing , 1 , 717 , Mine , 1 , 585 , Myself , 1 , 821 , Themselves , 1 , 793 , Disimproving , 1 , 965 , Succeeding , 1 , 727 , Worse , 1 , 961 , Theirs , 1 , 1259 , Mine , 1 , 578 , Better , 1 , 1112 , Mine , 1 , 1207 , Happy , 1 , 843 , Worse , 1 , 1064 , Failing , 1 , 699 , Happy , 1 , 700 , Myself , 1 , 516 , Them , 1 , 794 , Me , 1 , 526 , Sad , 1 , 1118 , Improving , 1 , 826 , Mine , 1 , 540 , Succeeding , 1 , 952 , Myself , 1 , 536 , Themselves , 1 , 851 , Improving , 1 , 865 , Mine , 1 , 582 ,Block 5 Time,: 35569 

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

 Participant Date Time Block Word1 Correct1 Time1.....Word36 Correct36 Time36 2456 1 Happy 1 1200 sad 0 1500 . . . 1234 5 sad 0 1100 happy 1 900 

Проблема состоит в том, что блоки 3 и 5 имеют 36 стимулов, в то время как блоки 1,2 и 4 имеют 12. Мне нужны участники, дата и время и время блокировки в каждой строке.

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

 BEGIN{ FS="\\"; RS="#"; OFS=","; ORS="\n"; }{ for(i=1;i<=NF;i++) {printf "%-10s", $i; printf ",";} } 

Я использую gawk версию 3.1.6 на Ubuntu 10.04.

One Solution collect form web for “Нужна помощь в обработке текстового файла с awk для соответствия формату файлов CSV”

Если я правильно понимаю, ваша проблема справляется с вводом, где каждая запись поступает в несколько строк, и вы не обнаруживаете конец записи, а скорее начало новой записи: новая запись начинается всякий раз, когда строка не начинается с запятая.

Вот несколько awk-шаблонов, которые вы можете использовать для предварительной обработки ввода в записи.

 function process (record) { RS = " *, *"; /*gawk allows RS to be a regexp; some implementations would require setting RS="," and manually trimming spaces*/ $0 = record; /*automatically sets $1, $2, ..., and NF*/ record = ""; /*your code goes here*/ } { if (/^ *,/) {record = record $0} else {process(record); record=$0} } END { if (record != "") {process(record)} }' 
  • Как оптимизировать скрипт с помощью NF и цикла for
  • Добавление значений во втором столбце, если первая запись столбца одинакова в UNIX
  • Как я могу получить и сравнить два значения из файла?
  • Обработка таблицы с разделенными запятыми значениями в разных столбцах
  • Обработка текста с использованием Linux
  • Есть ли отдельный инструмент, который будет записывать отчеты из файлов данных CSV
  • Неожиданный вывод из awk printf
  • Может ли python извлекать таблицы org-mode из документов org?
  • Как удалить все \ r \ n из файла, но сохраните \ n
  • Есть ли способ сортировать grep-вывод csv-файла?
  • Как получить число символов в одном столбце?
  • Interesting Posts

    Как диагностировать и исправлять Arch Linux, не просыпаясь от спящего режима?

    -bash: синтаксическая ошибка около неожиданного токена `; '

    Как установить локальный RPM, используя только файлы RPM с локальной зависимостью?

    как знать тест smartd был успешно завершен или нет

    Каков механизм, при котором процесс, слушая localhost, отказывается обрабатывать запрос на свой IP-адрес LAN?

    Сделать GPG Agent навсегда хранить парольную фразу

    Перемещение окна на другой компьютер

    Могу ли я определить, будет ли проверка подлинности ssh успешной до попытки?

    Странное поведение контроля-d

    Тестирование программно для поддержки отверстий для файлов

    Подсчитайте количество слов определенной длины из файла

    как обновить QT 4.5.3 OpenSuse 11.2 до QT 4.7.3?

    Команда tac command создает странный вывод

    Где ext4 хранит размеры каталога?

    Почему я не могу изменить уровень запуска от 1 до 5 в моем Debian 7.8?

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