通过管道传输到 wC语言 l 的 awk 命令的回显错误



我有数百个文件包含类似于这样的行:

>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

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

谢谢。

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

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

假设您使用的是shbash,这是我要做的:

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

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

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

  2. 您的$number是一个外壳变量。 Shell 变量扩展不会在单引号内进行,因此awk脚本中的$number没有机会被所需的数字替换。 为了解决这个问题,你可以使用双引号将数字嵌入正确的位置(这会造成一些麻烦,因为awk脚本中的其他美元符号你不想被shell扩展),或者你可以使用外部初始化的awk变量。 这就是-v论点的作用。

  3. 最后但并非最不重要的一点是,您需要修复filename中的小写字母"N"。

在这里我给出完整的脚本:

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

相关内容

  • 没有找到相关文章

最新更新