我的 awk 脚本没有使用所有输入行
My awk script not using all lines of input
仅供参考:$NEWFILE 是 newfile.vcf
awk 'BEGIN {FS="[\t]+"}; NR <= 2 || >= 100 {print [=10=] > "newfile.vcf"}'
$NEWFILE
所以这是我的 awk 代码。我有一个数据列表,第6列必须大于或等于100。我也想忽略前2行。
数据由制表符分隔,但以新行结束。我的代码只处理一行数据,恰好第 6 列大于 100。(但是,它确实忽略了前两行),然后停止。其余的行没有出现在 newfile.vcf 我猜是因为新行。无论如何,我该如何解决这个问题?
输入:
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 '}`
LINESINLEGEND=$((LINESINLEGEND-1))
NEWLEGEND=`tail -n$LINESINLEGEND `
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 "^\#\#" >> $NEWFILE
awk 'NR==1 || >= 100' newfile.vcf > newfile.vcf
#suggested code makes nothing appear in newfile.vcf
fi
这个命令应该做到:
awk 'NR==1 || >= 100' input.file > newfile.vcf
NR==1
匹配第一行输入。 >= 100
匹配那些 QUAL
大于或等于 100
的行。 awk 中的默认操作是打印输入到输出的整个过程。这就是为什么您可以省略 {print [=15=]}
.
您不需要指定 TAB
作为分隔符,因为它是默认分隔符之一。
我认为这应该可以解决问题:
awk -F"\t" '{if ( > 100 || NR<=2) print [=10=]}' input.vcf > newfile.vcf
当然,使用 awk 有很多方法可以给猫剥皮。除了将 $6 令牌写为 6$ 之外,您的脚本确实应该有效。如果我刚写的这个脚本做同样的事情,那么输入文件中可能不是所有行都是制表符分隔的。
仅供参考:$NEWFILE 是 newfile.vcf
awk 'BEGIN {FS="[\t]+"}; NR <= 2 || >= 100 {print [=10=] > "newfile.vcf"}'
$NEWFILE
所以这是我的 awk 代码。我有一个数据列表,第6列必须大于或等于100。我也想忽略前2行。
数据由制表符分隔,但以新行结束。我的代码只处理一行数据,恰好第 6 列大于 100。(但是,它确实忽略了前两行),然后停止。其余的行没有出现在 newfile.vcf 我猜是因为新行。无论如何,我该如何解决这个问题?
输入:
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 '}`
LINESINLEGEND=$((LINESINLEGEND-1))
NEWLEGEND=`tail -n$LINESINLEGEND `
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 "^\#\#" >> $NEWFILE
awk 'NR==1 || >= 100' newfile.vcf > newfile.vcf
#suggested code makes nothing appear in newfile.vcf
fi
这个命令应该做到:
awk 'NR==1 || >= 100' input.file > newfile.vcf
NR==1
匹配第一行输入。 >= 100
匹配那些 QUAL
大于或等于 100
的行。 awk 中的默认操作是打印输入到输出的整个过程。这就是为什么您可以省略 {print [=15=]}
.
您不需要指定 TAB
作为分隔符,因为它是默认分隔符之一。
我认为这应该可以解决问题:
awk -F"\t" '{if ( > 100 || NR<=2) print [=10=]}' input.vcf > newfile.vcf
当然,使用 awk 有很多方法可以给猫剥皮。除了将 $6 令牌写为 6$ 之外,您的脚本确实应该有效。如果我刚写的这个脚本做同样的事情,那么输入文件中可能不是所有行都是制表符分隔的。