Синтаксическая ошибка в awk при использовании переменной оболочки с оператором if / then - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь заставить работать следующий код, но продолжаю получать синтаксические ошибки в части скрипта на awk.

Вкратце, я хочу вычислить значение отсечения и сохранить его как плавающее десятичное число в числовой переменной (например, отсечение). Я хочу передать эту переменную в скрипт awk, который я пробую, но все еще сталкиваюсь с проблемами синтаксиса с ошибками, которые заявляют:

    awk: syntax error at source line 3
       context is
           >>> <<<

Вот следующие примеры последовательностей могут иметь первые четыре строки файла Spl-129-run10_xx.fa :

>Spl-129_TTCAGTGG_80 CAGACATAGTCATCTATCAATACATaGATGATTTGTATGTAGGATCTGACTTAGAAATAGGGCAGCATAGAACAAAAATAGAGGAACTGAGACAACATCTGTTGAGGTGGGGATTTACCACACCAGACAAAAAACATCAGAAAGAACCTCCATTCCTTTGGATGGGTTATGAACTCCATCCTGATAAATGGACAGTACAGCCTATAGTGCTGCCAGAAAAGGACAGCTGGACTGTCAATGACATACAGA

>Spl-129_TGGGGACC_80 CAGACATAGTCATCTATCAATACATaGATGATTTGTATGTAGGATCTGACTTAGAAATAGGGCAGCATAGAACAAAAATAGAGGAACTGAGACAACATCTGTTGAGGTGGGGATTTACCACACCAGACAAAAAACATCAGAAAGAACCTCCATTCCTTTGGATGGGTTATGAACTCCATCCTGATAAATGGACAGTACAGCCTATAGTGCTGCCAGAAAAGGACAGCTGGACTGTCAATGACATACAGA

и теперь код:

    for file in *fa; do
        name=`echo $file | cut -d'.' -f1`;
        awk 'BEGIN{RS=">"}NR>1{sub("\n","\t"); gsub("\n",""); print RS$0}' $file | tail -n+2 | sed 's/_/\t/g' >tmp;
        m=`cut -f3 tmp | sort -nr | head -n1`;
        cutoff=`echo "(-1.24*10^-21*$m^6)+(3.53*10^-17*$m^5)-(3.90*10^-13*$m^4)+(2.12*10^-9*$m^3)-(6.06*10^-6*$m^2)+(0.018*$m)+3.15" | bc`;
        echo "$name\t$cutoff";

        awk -v c="$cutoff" -v n="$name" '{ 
            if (c < 4) 
           awk '$3 > 2' tmp >n"_CUT.txt"; 

           else awk '$3 > c' tmp >n"_CUT.txt"; 
    }';
    done

Ожидаемый результат должен быть файл с разделителями табуляции (например, «Spl-129-run10_CUT.txt») в форме примера

>Spl-129 TGGGGACC 80 sequence

В конце дня я хочу использовать Рассчитанная выше переменная среза для фильтрации последовательностей, меньших среза (с использованием значения в третьем поле в качестве сравнения) с условием, что если среза меньше 4, то будет использоваться среза 2.

Любой помощь, которую вы могли бы оказать, будет высоко ценится. Спасибо!

1 Ответ

0 голосов
/ 21 января 2020

У фрагмента awk есть несколько проблем. В частности, кажется, что из-за скрипта awk возникают ненужные вызовы awk:

 awk -v c="$cutoff" -v n="$name" '{ 
            if (c < 4) 
           awk '$3 > 2' tmp >n"_CUT.txt"; 

           else awk '$3 > c' tmp >n"_CUT.txt"; 
    }';

Без дополнительных подробностей (и примеров ввода) трудно найти работающее решение. Рассмотрите возможность размещения примеров ввода и вывода. В частности, неясно, как следует рассчитывать отсечку по входным данным.

...