簡體   English   中英

我的awk腳本未使用所有輸入行

[英]My awk script not using all lines of input

僅供參考:$ NEWFILE是newfile.vcf

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

這是我的awk代碼。 我有一個數據列表,第6列必須大於或等於100。我也想忽略前2行。
數據由制表符分隔,但以新行結尾。 我的代碼僅處理一行數據,恰巧第6列大於100。(但是,忽略了前2行),然后停止。 由於新行,其余行未顯示在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

所需的Ouput:

                                                     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

此命令應執行以下操作:

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

NR==1匹配輸入的第一行。 $6 >= 100匹配那些QUAL大於或等於100 awk中的默認操作是在輸入到輸出的同時打印整個輸出。 這就是為什么您可以省略{print $0}

您不需要將TAB指定為定界符,因為它是默認定界符之一。

我認為這應該可以解決問題:

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

當然,使用awk可以為貓剝皮有多種方法。 除了將$ 6代幣寫為6 $之外,您的腳本確實應該起作用。 如果我剛剛編寫的腳本執行相同的操作,則可能不是您輸入文件中的所有行都用制表符分隔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM