Ошибка Bashscript в Ubuntu: awk: строка 1: регулярное выражение превышает ограничение размера реализации - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь применить этот код к аннотированному файлу, сгенерированному snpEff: (Моя ОС - Ubuntu)

grep -v '^##' /home/zee/fdr_vs_wt.snp.annotated.vcf | awk 'BEGIN{FS=" "; OFS=" "} $1~/SL2.50chch/ || $10~/^1\/1/ && ($11~/^1\/0/ || $11~/^0\/0/ || $11~/^0\/1/) && $1~/^[0-9X]*$/ && /splice_acceptor_variant|splice_donor_variant|splice_region_variant|stop_lost|start_lost|stop_gained|missense_variant|coding_sequence_variant|inframe_insertion|disruptive_inframe_insertion|inframe_deletion|disruptive_inframe_deletion|exon_variant|exon_loss_variant|exon_loss_variant|duplication|inversion|frameshift_variant|feature_ablation|duplication|gene_fusion|bidirectional_gene_fusion|rearranged_at_DNA_level|miRNA|initiator_codon_variant|start_retained/ {$3=$7=""; print $0}' | sed 's/  */ /g' | awk '{split($9,a,":"); split(a[2],b,","); if (b[1]>b[2] || $1~/SL2.50ch/) print $0}' > /home/zee/fdr_vs_wt.raw.vcfmutantbulk.cands2.txt

Я получаю следующую ошибку:

awk: line 1: regular expression /splice_acc ... exceeds implementation size limit

Может кто-нибудь помочь, пожалуйста? Я знаю, что этот вопрос был задан другим человеком некоторое время назад, но я технически не силен, и я не понимал решения, которые были даны. Заранее спасибо.

Я также собираюсь использовать этот код в моем Java GUI позже, я буду использовать ProcessBuilder для запуска его со следующим кодом:

    speciesFastaVersionCH = "SL2.50";

    String longInputcmd4b = "ch/ || $10~/^1\\/1/ && ($11~/^1\\/0/ || $11~/^0\\/0/ || $11~/^0\\/1/) && $1~/^[0-9X]*$/ && /splice_acceptor_variant|splice_donor_variant|splice_region_variant|stop_lost|start_lost|stop_gained|missense_variant|coding_sequence_variant|inframe_insertion|disruptive_inframe_insertion|inframe_deletion|disruptive_inframe_deletion|exon_variant|exon_loss_variant|exon_loss_variant|duplication|inversion|frameshift_variant|feature_ablation|duplication|gene_fusion|bidirectional_gene_fusion|rearranged_at_DNA_level|miRNA|initiator_codon_variant|start_retained/ {$3=$7=\"\"; print $0}' | sed 's/  */ /g' | awk '{split($9,a,\":\"); split(a[2],b,\",\"); if (b[1]>b[2] || $1~/";
    StringBuilder cmd4 = new StringBuilder().append("\"").append("grep -v '^##' ").append(outputFilecmd3).append(" | awk 'BEGIN{FS=\" \"; OFS=\" \"} $1~/").append(speciesFastaVersionCH).append(longInputcmd4b).append(speciesFastaVersionCH).append("ch/) print $0}' > ").append(outputFilecmd5).append("\"");



    System.out.println("Here is cmd4:" + cmd4.toString());
    String [] gatkArray1 = cmd1.split(" ");
    String [] gatkArray2 = cmd2.split(" ");
    String [] gatkArray3 = {"bash", "-c", cmd3};


    String [][] gatkArrays = {gatkArray1, gatkArray2, gatkArray3};


    ProcessBuilder pb = new ProcessBuilder(gatkArray3);
    pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
    pb.redirectError(ProcessBuilder.Redirect.INHERIT);
    Process p = pb.start();

1 Ответ

0 голосов
/ 28 июня 2018

Ваша реализация awk не поддерживает регулярные выражения такой длины.

В частности, вы используете mawk, где максимальное ограничение регулярного выражения равно 400, включая //:

$ true | mawk "/$(printf '%397s')/"
(no output)

$ true | mawk "/$(printf '%398s')/" 
mawk: line 1: regular expression /           ... exceeds implementation size limit

Вы можете либо переписать свой awk-скрипт, чтобы использовать более короткие литералы регулярных выражений (максимальный размер, гарантированный POSIX, составляет 256 байт ), либо переключиться на реализацию, подобную gawk, где единственным ограничением является максимальный аргумент Linux размер 128 КБ:

$ true | gawk "/$(printf '%131069s')/"
(no output)

$ true | gawk "/$(printf '%131070s')/"
bash: /usr/bin/gawk: Argument list too long
...