我有数百个包含与此类似的行的文件:
>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
所有变体都会产生无效的选项错误,具体取决于未注释的行。
非常感谢。
答案 0 :(得分:3)
你不需要wc -l
管道,即使不需要文件名的for循环,试试这个:
awk -v n=0.95 '$5<n{a++}END{print a}' *_genus.txt
答案 1 :(得分:1)
假设您正在使用sh
或bash
,这就是我要做的事情:
NUM=`awk -v x=$number '$5 < x {print $5}' $fileName | wc -l`
解释为什么这样做并且您的尝试不起作用的一些解释:
您需要执行管道并将其输出存储在变量NUM
中。这就是为什么你需要管道周围的反引号。
您的$number
是一个shell变量。 Shell变量扩展不会在单引号内发生,因此$number
脚本中的awk
无法替换为您想要的数字。要解决这个问题,你可以使用双引号将数字嵌入到正确的位置(由于awk
脚本中你不希望进行shell扩展的其他美元符号,这会造成一些麻烦) ,或者您可以使用外部初始化的awk
变量。这就是-v
参数的作用。
最后但并非最不重要的是,您需要修复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