Как извлечь несколько данных из файла и сохранить его в файле csv?

У меня есть файл в следующем формате:

19-08-02 Name appel ok hope local merge (mk) juin nov sept oct 00:00:t1 T1 299 0 24 8 3 64 F2 119 0 11 8 3 62 I1 25 0 2 9 4 64 F3 105 0 10 7 3 61 Regulated F2 0 0 0 FR T1 104 0 10 7 3 61 00:00:t2 T1 649 0 24 8 3 64 F2 119 0 11 8 3 62 I1 225 0 2 9 4 64 F3 165 0 10 7 3 61 Regulated F2 5 0 0 FR T1 102 0 10 7 3 61 20-08-02 Name appel ok hope local merge (mk) juin nov sept oct 00:00:t5 T1 800 0 24 8 3 64 F2 111 0 11 8 3 62 I1 250 0 2 9 4 64 F3 105 0 10 7 3 61 Regulated F2 0 0 0 FR T1 100 0 10 7 3 61 

и я хочу извлечь некоторые данные и записать их в другой файл CSV file в следующем формате:

  T1 F2 I1 F3 Regulated F2 FR T1 00:00:t1 299 119 25 105 0 104 00:00:t2 649 119 225 165 5 102 00:00:t5 800 111 250 105 0 100 ....... 

Мне просто нужно извлечь значения в третьем полевом приложении каждые 00:00:XX Я пытался использовать awk но мне не удалось получить правильный скрипт, особенно пятый, состоит из двух слов: Regulated F2 . Я не знаю, как извлечь его как одно слово.

Любая помощь пожалуйста!

  • Удалить строки из файла с разделителями табуляции с отсутствующими значениями
  • sed - найти строку и добавить
  • Замена нескольких пустых строк одной пустой строкой в ​​vim / sed
  • sed regex не работает
  • Как вставить содержимое файла в другой файл перед шаблоном (маркером)?
  • поиск точной строки в unix
  • Как использовать grep или sed для извлечения нескольких совпадений в одной строке
  • Awk и отбрасывание несовпадающих токенов в строке?
  • 2 Solutions collect form web for “Как извлечь несколько данных из файла и сохранить его в файле csv?”

    Использование Perl:

     perl -lane 'BEGIN{ print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1"); $, = "\t" } if($F[0] =~ /00:00:t[0-9]+/){ @f[0] = $F[0]; @f[1] = $F[2]; for($i = 2; $i < 7; $i++) { $_ = <>; @F=split(); if($i < 5){ $f[$i] = $F[1] }else{ $f[$i] = $F[2] } } print(@f) }' file 

    Расширенный скрипт (который должен быть выполнен с помощью chmod +x script.pl и запускаться с ./script.pl file ):

     #!/usr/bin/perl -lan BEGIN { print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1"); $, = "\t" } if($F[0] =~ /00:00:t[0-9]+/) { $f[0] = $F[0]; $f[1] = $F[2]; for($i = 2; $i < 7; $i++) { $_ = <>; @F=split(); if($i < 5) { $f[$i] = $F[1] } else { $f[$i] = $F[2] } } print(@f) } 

    Вы можете отрегулировать заголовок, изменив print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1"); и разделитель выходного поля, модифицируя $, = "\t" .

     % cat file 19-08-02 Name appel ok hope local merge (mk) juin nov sept oct 00:00:t1 T1 299 0 24 8 3 64 F2 119 0 11 8 3 62 I1 25 0 2 9 4 64 F3 105 0 10 7 3 61 Regulated F2 0 0 0 FR T1 104 0 10 7 3 61 00:00:t2 T1 649 0 24 8 3 64 F2 119 0 11 8 3 62 I1 225 0 2 9 4 64 F3 165 0 10 7 3 61 Regulated F2 5 0 0 FR T1 102 0 10 7 3 61 20-08-02 Name appel ok hope local merge (mk) juin nov sept oct 00:00:t5 T1 800 0 24 8 3 64 F2 111 0 11 8 3 62 I1 250 0 2 9 4 64 F3 105 0 10 7 3 61 Regulated F2 0 0 0 FR T1 100 0 10 7 3 61 % perl -lane 'BEGIN{ print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1"); $, = "\t" } if($F[0] =~ /00:00:t[0-9]+/){ @f[0] = $F[0]; @f[1] = $F[2]; for($i = 2; $i < 7; $i++) { $_ = <>; @F=split(); if($i < 5){ $f[$i] = $F[1] }else{ $f[$i] = $F[2] } } print(@f) }' file T1 F2 I1 F3 Regulated F2 FR T1 00:00:t1 299 119 25 105 0 104 00:00:t2 649 119 225 165 5 102 00:00:t5 800 111 250 105 0 100 % 

    Задача довольно проста: игнорировать строки, начинающиеся с даты или строк, содержащих столбцы месяца; если первая строка содержит время теста, возьмите это время и третий столбец; для всех остальных линий – захватить второй столбец. Ниже приведен AWK скрипта AWK .

    Демоверсия:

     $> ./data2cvs.awk testData.txt T1,F2,I1,F3,Regulated F2,FR T1 00:00:t1,299,119,25,105,0,104 00:00:t2,649,119,225,165,5,102 00:00:t5,800,111,250,105,0,100 

    Источник скрипта

     #!/usr/bin/awk -f BEGIN { HEADER="T1,F2,I1,F3,Regulated F2,FR T1"; print HEADER } # Ignore lines containing date and month $1~/^[[:digit:]]{2}-.+/ || $0~/juin.*nov.*sept.*oct/ { next ; } # Grab test time and first data value # Essentially doing something like sprintf in C # to a string of arrays $1~/^[[:digit:]]{2}:.+/{ count++ DATA[count]=$1","$3 } # grab remaining data values $1 !~ /^[[:digit:]]{2}:.+/{ if ($1~/Regulated/ || $1~/FR/){ DATA[count]=DATA[count]","$3 } else { DATA[count]=DATA[count]","$2 ; } } # print gathered data to STDIN END{ for (i=1;i<=count;i++) print DATA[i] } 
    Interesting Posts

    Как я могу сказать, что я бегу в chroot?

    Отправка файлов в каталоги с использованием сопоставления имен

    Проверяет наличие статуса выхода, отличного от 0, после команды `command || return` недостижимый?

    Как показать имя хоста в командной строке командной строки Linux

    Смонтируйте и скопируйте / var в хранилище экземпляров EC2 во время первой загрузки

    Есть ли способ заставить COMPREPLY выводиться как вертикальный список слов вместо одной строки?

    ImageMagick: изменение размера изображения без масштабирования

    Странное поведение процесса на виртуализированном Ubuntu

    Выводить несколько файлов из одного grep?

    Не удается запустить службу sshd в подсистеме Windows linux

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

    Разрешать только определенные пакеты из одного репо

    Псевдоним в .bashrc, похоже, не принимает аргумент

    Серверная сторона против рендеринга на стороне клиента Дисплей сервера

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

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