сплит 60GB плоский файл с записями, иногда охватывающих несколько строк

Ручной ввод данных делает базу данных загрязненной записями, содержащими несколько символов новой строки. Для хороших записей, разделенных двойными кавычками в начале и в конце в огромном плоском файле размером 60 ГБ с только одним столбцом, они должны всегда охватывать только одну строку следующим образом:

«Теперь доступны полные последовательности многочисленных митохондриальных, многих прокариотических и нескольких ядерных геномов».

Для плохих записей они охватывают неопределенное количество нескольких строк:

«Текущее курение было сильно и обратно связано с высоким риском

после корректировки сопутствующих факторов риска. Относительно никогда

курильщики, курильщики в настоящее время значительно реже имеют риск

шаблон. "

Эти многострочные записи запрещают разделение файлов вниз по UNIX-команде. split не может разумно распознать эти несколько строк как одну запись, и это может привести к разделению одной записи на отдельные файлы. Perl ниже слишком медленный, чтобы объединить эти строки для плохих записей сначала для этого огромного файла перед расщеплением, так как число $ count не может быть напечатано после ожидания более 2 часов.

 $file=$ARGV[0]; open(INFO, $file) or die("Could not open $file."); open(OUT, ">out") or die("Could not open $file."); $mergedline = ""; $count=0; foreach $line (<INFO>) { print $count++; if ($line =~ /^".*"\n$/) { print OUT $line; $mergedline = ""; next; } elsif ($line =~ /"\n$/) { print OUT $mergedline; $mergedline = ""; next; } else { chomp $line; $mergedline .= $line; } } close(INFO); 

Любая удобная команда UNIX для решения этой проблемы, чтобы выходной файл был «чистым» только с однострочными записями, которые можно обрабатывать с помощью split ?

sed представляется вариантом, но ни одна из следующих должностей не отвечает на этот вопрос:

https://stackoverflow.com/questions/15758814/turning-multiple-lines-into-one-line-with-comma-separated-perl-sed-awk

https://stackoverflow.com/questions/11290616/sed-conditional-merge-of-multiple-lines

http://www.unix.com/shell-programming-and-scripting/80633-sed-combining-multiple-lines-into-one.html

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

  • Как сохранить один файл в каталоге?
  • Как найти полную историю файла?
  • Как рекурсивно перемещать партии из 20 файлов в пронумерованные папки из папки из 1000 файлов
  • Какие три файла всегда открыты процессом?
  • Еще можно читать файл после изменения разрешений
  • Как ACL вычисляет эффективные разрешения для файла?
  • Минимальные права доступа к файлу для удаления файла
  • Как обрезать байты с начала и конца файла?
  • 3 Solutions collect form web for “сплит 60GB плоский файл с записями, иногда охватывающих несколько строк”

    Использование sed для соединения только разделенных строк

     sed ':a /".*"$/b N;s/\n/ /;ba' input >> output 

    занимает 6 секунд для 10-мегабайтного файла в моей системе. Это будет 10 часов за 60 ГБ.

    bbe немного быстрее

     bbe -b '/"/:/"/' -o output -e 'y/\n/ /' input 

    но все равно занимает 4 секунды.

    Я боюсь, что эти языки сценариев не являются инструментом для работы на экстремально больших файлах. Как насчет написания небольшой программы в C ?

    пример с использованием gawk :

     awk 'BEGIN {RS = "\"\n"} {++n; print $0"\""> n".txt"}' input 

    Это говорит о разделении input файла на любую последовательность " за которой следует новая строка ( \n ). Это будет игнорировать строки, которые не сразу следуют за меткой кавычки, сохраняя многострочные записи. В этом примере вывод записывается в текстовый файл, но если вы удалили часть > n".txt" , вы могли бы отправлять записи в конвейер.

    Ваш Perl медленный из- for цикла for который используется для чтения в файле. Вы действительно должны использовать цикл while, поскольку цикл for загружает весь файл в памяти за один раз. Вот почему навечно печатать $ count.

     perl -ne ' print,next if /^".*"$/m or /"$/m; chomp, $_ .= <>, redo unless eof; ' gene.data 
    Interesting Posts

    имя файла для файлов с идентификатором процессора и временным шагом должно включать имя файла

    Что такое | символ рядом с командой?

    Невозможно заставить YouCompleteMe функционировать

    Извлечение файла из каталога внутри файла tar без создания этого каталога

    контролировать множественные пипы с верхним

    Сервер Apache не запускается при загрузке mod_sm.so

    установка бита «x» (исполняемый) с использованием ACL

    sed заменяет слишком много входов

    virt-install cpu0 необработанный rdmsr

    Обертка Bash, которая будет форматировать вывод другой программы

    Как вы используете badblocks?

    KDE – Kmail: Как поставить окно предварительного просмотра сообщения справа?

    Что происходит с данными раздела подкачки Linux при запуске Windows с помощью двойной загрузки

    Доступ к графическому интерфейсу уже запущенного приложения через SSH

    Как установить последний R, когда эта проблема Java в Debian?

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