我有数百个文件包含类似于这样的行:
>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
假设您使用的是sh
或bash
,这是我要做的:
NUM=`awk -v x=$number '$5 < x {print $5}' $fileName | wc -l`
一些解释为什么这有效并且您的尝试不起作用:
您需要执行管道并将其输出存储在变量
NUM
中。 这就是为什么您需要管道周围的反引号。您的
$number
是一个外壳变量。 Shell 变量扩展不会在单引号内进行,因此awk
脚本中的$number
没有机会被所需的数字替换。 为了解决这个问题,你可以使用双引号将数字嵌入正确的位置(这会造成一些麻烦,因为awk
脚本中的其他美元符号你不想被shell扩展),或者你可以使用外部初始化的awk
变量。 这就是-v
论点的作用。最后但并非最不重要的一点是,您需要修复
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