我的awk脚本没有使用所有输入行

时间:2015-02-25 00:36:54

标签: bash shell unix awk

仅供参考:$ NEWFILE是newfile.vcf

awk 'BEGIN {FS="[\t]+"}; NR <= 2 || $6 >= 100 {print $0 > "newfile.vcf"}'
$NEWFILE

所以这是我的awk代码。我有一个数据列表,第6列必须大于或等于100.我也想忽略前两行 数据由制表符分隔,但以新行结束。我的代码只执行一行数据,这恰好使第6列大于100.(但是,它会忽略前两行),然后停止。其余的行没有显示在newfile.vcf我因为新行而猜测。无论如何我该如何解决这个问题?

INPUT:

                                                     NAME1    NAME2    NAME3
#CHROM   POS    ID    ALT    REF   QUAL   FILTER    953_102   953_103    953_104
Chr1    1058     .     TAA    TAAA    999   StandBias
Chr1    1071     .     TAA    TAAA    118   StandBias
Chr1    1084     .     TAA    TAAA    27.5  StandBias
Chr1    1089     .     TAA    TAAA    999   StandBias

所需的输出:

                                                     NAME1    NAME2    NAME3
#CHROM   POS    ID    ALT    REF   QUAL   FILTER    953_102   953_103    953_104
Chr1    1058     .     TAA    TAAA    999   StandBias
Chr1    1071     .     TAA    TAAA    118   StandBias
Chr1    1089     .     TAA    TAAA    999   StandBias

当前输出:

                                                     NAME1    NAME2    NAME3
#CHROM   POS    ID    ALT    REF   QUAL   FILTER    953_102   953_103    953_104
Chr1    1058     .     TAA    TAAA    999   StandBias

程序(虽然awk之前的东西与问题无关。在awk之前的所有内容都按预期工作。)

#! /bin/bash
#removing the extra stuff at the top of datafile.
NEWFILE=newfile.vcf
LINESINLEGEND=`wc legend.txt | awk {'print $1'}`
LINESINLEGEND=$((LINESINLEGEND-1))
NEWLEGEND=`tail -n$LINESINLEGEND $2`

if [ $# -eq 0 ]
then
    echo "usage: filename.vcf <optional>legend.txt"
fi

if [ $# -eq 2 ]
then
    printf "$NEWLEGEND" > temp
    CUTME=`cut -f 5 temp | cut -d " " -f 4 temp | tr -s '\n' '\t'`
    rm temp
    printf "" > $NEWFILE
    printf "\t" >> $NEWFILE
    printf "\t" >> $NEWFILE
    printf "\t" >> $NEWFILE
    printf "\t" >> $NEWFILE
    printf "\t" >> $NEWFILE
    printf "\t" >> $NEWFILE
    printf "\t" >> $NEWFILE
    printf "\t" >> $NEWFILE
    printf "\t" >> $NEWFILE
    printf "$CUTME\n" >> $NEWFILE

    grep -v "^\#\#" $1 >> $NEWFILE
    awk 'NR==1 || $6 >= 100' newfile.vcf > newfile.vcf
    #suggested code makes nothing appear in newfile.vcf
fi

2 个答案:

答案 0 :(得分:2)

此命令应该这样做:

awk 'NR==1 || $6 >= 100' input.file > newfile.vcf

NR==1匹配第一行输入。 $6 >= 100匹配QUAL大于或等于100的行。 awk中的默认操作是将输入的整个输出打印到输出。这就是为什么你可以省略{print $0}

您不需要指定TAB作为分隔符,因为它是默认分隔符之一。

答案 1 :(得分:0)

我认为这应该可以解决问题:

 awk -F"\t" '{if ( $6 > 100 || NR<=2) print $0}' input.vcf > newfile.vcf

当然,使用awk可以通过多种方式为猫皮肤涂抹。除了6美元的令牌被写为6 $之外,你的脚本确实应该有效。如果我刚写的这个脚本做了同样的事情,那么输入文件中的所有行都可能不是制表符分隔的。