代码之家  ›  专栏  ›  技术社区  ›  Michael Gruenstaeudl

Bash while循环:被第三方命令中断

  •  0
  • Michael Gruenstaeudl  · 技术社区  · 3 年前

    假设输入表( intable.csv )在其第二列中包含ID号,以及一个新的输出表( outlist.csv )其中输入文件(扩展一列)将逐行写入。

    echo -ne "foo,NC_045043\nbar,NC_045193\nbaz,n.a.\nqux,NC_045054\n" > intable.csv
    echo -n "" > outtable.csv
    

    进一步假设一个或多个第三方命令(这里: esearch , efetch ; 两部分 Entrez Direct )用于检索每个ID号的附加信息。此附加信息将构成输出表的第三列。

    while IFS="" read -r line || [[ -n "$line" ]]
    do
        echo -n "$line" >> outtable.csv
        NCNUM=$(echo "$line" | awk -F"," '{print $2}')
        if [[ $NCNUM == NC_* ]]
        then
            echo "$NCNUM"
            RECORD=$(esearch -db nucleotide -query "$NCNUM" | efetch -format gb)
            echo "$RECORD" | grep "^LOCUS" | awk '{print ","$3}' | \
              tr -d "\n" >> outtable.csv
        else
            echo ",n.a." >> outtable.csv
        fi
    done < intable.csv
    

    记录 回音“$RECORD” 你被淘汰了?如何纠正这种行为?

    1 回复  |  直到 3 年前
        1
  •  0
  •   Barmar    3 年前

    如果 esearch while 循环,因此它将使用输入文件的其余部分。

    解决方法是将标准输入重定向到其他地方,例如。 /dev/null .

    while IFS="" read -r line || [[ -n "$line" ]]
    do
        echo -n "$line" >> outtable.csv
        NCNUM=$(echo "$line" | awk -F"," '{print $2}')
        if [[ $NCNUM == NC_* ]]
        then
            echo "$NCNUM"
            RECORD=$(esearch -db nucleotide -query "$NCNUM" </dev/null | efetch -format gb)
            echo "$RECORD" | grep "^LOCUS" | awk '{print ","$3}' | \
              tr -d "\n" >> outtable.csv
        else
            echo ",n.a." >> outtable.csv
        fi
    done < intable.csv