разделить файл на две части по шаблону

Ядро perldoc идет с пакетом жемчуга в дуге. например. perldoc perllol. Для большинства модулей вся утилита делает создать документацию из POD в источнике все же. /usr/lib/perl5/core_perl/POSIX.pm оказывается, не имеет никакого POD, так не создает документации. Я предполагаю, потому что это - модуль XS так большая часть из, его - функция, находится в C где-то в другом месте.

При сравнении Дуги с полем Debian с perldoc на Debian некоторые базовые модули также имеют отдельное .pod файл в /usr/share/perl/5.x/ тогда как у Arch нет ни одного.

POSIX.pm, кажется, немного отличается снова в этом .pod находится в каталоге lib..

debian$ find /usr/lib/ -name "*.pod"
/usr/lib/perl/5.10.1/Config.pod
/usr/lib/perl/5.10.1/POSIX.pod

Который делает, это быть похожим на debian делает что-то пользовательское здесь.

На самом деле, если Вы проверяете источник жемчуга POSIX.pod отдельный файл, сидящий рядом с модулем жемчуга.

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

14
10.05.2015, 19:03
6 ответов

С помощью awk можно сделать:

awk '{print >out}; /XYZ/{out="file2"}' out=file1 largefile


Объяснение: Первый аргумент awk (out=file1) определяет переменную с именем файла, которая будет использована для вывода, в то время как последующий аргумент (largefile) обрабатывается. Программа awk выведет все строки в файл, заданный переменной out ({распечатка >out}). Если шаблон XYZ будет найден, то выходная переменная будет переопределена, чтобы указать на новый файл ({out="file2}"), который будет использоваться в качестве целевой для печати последующих строк данных.

References:

10
27.01.2020, 19:50

Простым взломом является печать на STDOUT или STDERR, в зависимости от того, был ли согласован целевой шаблон. Затем можно использовать операторы перенаправления оболочки для соответствующего перенаправления вывода. Например, в Perl, предполагая, что входной файл называется f и два выходных файла f1 и f2:

  1. Отбрасывание линии, совпадающей с шаблоном разделения:

    perl -ne 'if(/XYZ/){$a=1; next} ; $a==1 ? print STDERR : print STDOUT;' f >f1 2>f2
    
  2. Включая совпадающую строку:

    perl -ne '$a=1 if /XYZ/; $a==1 ? распечатать STDERR : распечатать STDOUT;' f >f1 2>f2
    

В качестве альтернативы, распечатайте в разных файлах:

  1. Отбрасывание линии, соответствующей шаблону разделения:

    perl -ne 'BEGIN{open($fh1,">", "f1");open($fh2,">", "f2");}.
    if(/XYZ/){$a=1; next}$a==1 ? распечатайте $fh1 "$_" : распечатайте $fh2 "$_";' f
    
  2. Включая совпадающую строку:

    perl -ne 'BEGIN{open($fh1,">", "f1"); open($fh2,">", "f2");}
     $a=1 если /XYZ/; $a==1 ? распечатать $fh1 "$_" : распечатать $fh2 "$_";' f
    
1
27.01.2020, 19:50

В современном ksh варианте оболочки (т.е. без sed) одного из ответов, основанных на sed выше:

{ read in <##XYZ ; print "$in" ; cat >file2 ;} <largefile >file1


и другого варианта только в ksh (т.е. без sed). также исключая cat):

{ read in <##XYZ ; print "$in" ; { read <##"" ;} >file2 ;} <largefile >file1


(Чистое решение ksh кажется вполне работоспособным; в тестовом файле на 2,4 ГБ ему потребовалось 19-21 секунда, по сравнению с 39-47 секундами с подходом, основанным на sed/cat).

6
27.01.2020, 19:50
{ sed '/XYZ/q' >file1; cat >file2; } <infile

В GNU sed вы должны использовать переключатель -u nbuffered. Однако большинство других sed должны просто работать.

Чтобы исключить XYZ ...

{ sed -n '/XYZ/q;p'; cat >file2; } <infile >file1
6
27.01.2020, 19:50

Попробуйте это с помощью GNU sed:

sed -n -e '1,/XYZ/w file1' -e '/XYZ/,${/XYZ/d;w file2' -e '}' large_file
3
27.01.2020, 19:50

Это задание для csplit :

csplit -sf file -n 1 large_file /XYZ/

будет s незаметно разделить файл, создав части с предварительным f ix файлом ] и n , записанные с использованием одной цифры, например file0 и т. Д. Обратите внимание, что использование / regex / приведет к разделению, но не включает строку, которая соответствует regex . Чтобы разделить на и , включая соответствие строки регулярное выражение , добавьте смещение +1 :

csplit -sf file -n 1 large_file /XYZ/+1

Это создает два файла, file0 и файл1 . Если вам абсолютно необходимо, чтобы они назывались файл1 и файл2 , вы всегда можете добавить пустой шаблон в команду csplit и удалить первый файл:

csplit -sf file -n 1 large_file // /XYZ/+1

создает file0 , file1 и file2 , но file0 пуст, поэтому его можно безопасно удалить:

rm -f file0
14
27.01.2020, 19:50

Теги

Похожие вопросы