【问题标题】:awk syntax error in utilizing a shell variable with if/then statement使用带有 if/then 语句的 shell 变量时出现 awk 语法错误
【发布时间】:2020-01-21 07:57:04
【问题描述】:

我正在尝试使以下代码正常工作,但在脚本的 awk 部分中不断出现语法错误。

简而言之,我想计算一个截止值并将其作为浮点小数存储在一个数值变量中(例如,截止)。我想将此变量传递给我尝试的 awk 脚本,但仍然遇到语法问题并出现以下错误:

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

以下示例序列可能包含文件Spl-129-run10_xx.fa 的前四行:

&gt;Spl-129_TTCAGTGG_80 CAGACATAGTCATCTATCAATACATaGATGATTTGTATGTAGGATCTGACTTAGAAATAGGGCAGCATAGAACAAAAATAGAGGAACTGAGACAACATCTGTTGAGGTGGGGATTTACCACACCAGACAAAAAACATCAGAAAGAACCTCCATTCCTTTGGATGGGTTATGAACTCCATCCTGATAAATGGACAGTACAGCCTATAGTGCTGCCAGAAAAGGACAGCTGGACTGTCAATGACATACAGA

&gt;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”),示例形式为

&gt;Spl-129 TGGGGACC 80 sequence

最后,我想利用上面计算的截止变量来过滤小于截止的序列(使用第三个字段中的值作为比较),条件是如果截止小于 4,那么将使用 2 的截止值。

您能提供的任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 能否在您的问题中添加预期的输出,然后告诉我们。
  • 如果您能对您的要求进行完整的概述,我很确定我们可以在这方面提供更好的帮助。

标签: if-statement variables awk conditional-statements


【解决方案1】:

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"; 
    }';

如果没有其他详细信息(和示例输入),很难提供可行的解决方案。考虑发布示例输入和输出。特别是,不清楚应该如何从输入中执行截止值的计算。

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 2015-11-18
    • 1970-01-01
    • 2013-05-27
    • 2013-06-18
    • 2021-04-16
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多