发送到wc -l的awk命令的回声错误

时间:2014-01-23 23:58:51

标签: bash awk pipe

我有数百个包含与此类似的行的文件:

>34764998   Halalkalicoccus_jeotgali_B3   -132.6938   Halalkalicoccus   0.528  Halobacteriaceae  0.638 Halobacteriales   0.648 Halobacteria   0.706 Euryarchaeota  0.850 

我有兴趣计算第5列中小于0.1,... 0.95的项目数。我编写了一个bash脚本,调用AWK命令来查看列值,然后将其传递给wc -l(见下文)。但是,我没有正确安排我的$,'和括号。谁能告诉我我做错了什么?这可能不是最有效的方式,所以我欢迎建议,但我确实想知道我在列出的代码中做错了什么。

for fileName in 4440319.3_genus.txt 4440372.3_genus.txt 4440373.3_genus.txt 4440378.3_genus.txt 4440379.3_genus.txt 4440380.3_genus.txt 4440381.3_genus.txt
do
   echo $fileName
   for number in 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95
   do  
      #NUM={awk '$5 < '$number' {print $5}' $filename | wc -l}
      NUM={awk '$5 < $number {print $5}' $filename | wc -l} 
      #NUM=${awk '$5 < '$number' {print $5}' $filename | wc -l}
      #NUM=${awk '$5 < $number {print $5}' $filename | wc -l}
      echo $NUM
   done
done
exit 0

所有变体都会产生无效的选项错误,具体取决于未注释的行。

非常感谢。

3 个答案:

答案 0 :(得分:3)

你不需要wc -l管道,即使不需要文件名的for循环,试试这个:

awk -v n=0.95 '$5<n{a++}END{print a}' *_genus.txt

答案 1 :(得分:1)

假设您正在使用shbash,这就是我要做的事情:

NUM=`awk -v x=$number '$5 < x {print $5}' $fileName | wc -l`

解释为什么这样做并且您的尝试不起作用的一些解释:

  1. 您需要执行管道并将其输出存储在变量NUM中。这就是为什么你需要管道周围的反引号。

  2. 您的$number是一个shell变量。 Shell变量扩展不会在单引号内发生,因此$number脚本中的awk无法替换为您想要的数字。要解决这个问题,你可以使用双引号将数字嵌入到正确的位置(由于awk脚本中你不希望进行shell扩展的其他美元符号,这会造成一些麻烦) ,或者您可以使用外部初始化的awk变量。这就是-v参数的作用。

  3. 最后但并非最不重要的是,您需要修复filename中的小写“N”。

答案 2 :(得分:0)

这里我给出完整的脚本:

for fileName in 4440319.3_genus.txt 4440372.3_genus.txt 4440373.3_genus.txt 4440378.3_genus.txt 4440379.3_genus.txt 4440380.3_genus.txt 4440381.3_genus.txt
do
   echo $fileName
   for number in 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.95
   do  
      NUM={awk -v n=$number '$5<n{a++}END{print a}'} 
      echo "$NUM records is less than $number"
   done
done
exit 0