сплит 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

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

  • Какова команда поиска разрешений на чтение и запись для одного файла?
  • Как удалить установленные места, которые были добавлены с помощью команды mount?
  • Проблема сортировки нескольких столбцов Unix
  • Липкий бит и пользователи с разрешением sudo
  • Объедините несколько текстовых файлов в один со следующей строкой для каждого файла
  • rm -fr не работает
  • Копирование только новых файлов
  • Имя файла Regex с несколькими цифрами
  • 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 
    Linux и Unix - лучшая ОС в мире.