我被这个剧本困住了。我已经用临时文件的单个猫定义了一个变量,这些是脚本完成的以下操作。
PROJECT=$(cat temp/project_name_final) ;
#Bifidobacterium contigs selection
grep "Bifidobacterium" ${PROJECT}_genera.txt | gawk '{print $2}' > temp/${PROJECT}_Bif_genera ;
gawk '{print $3}' ${PROJECT}_species.txt > temp/${PROJECT}_Bif_species ;
grep -v -f temp/${PROJECT}_Bif_species temp/${PROJECT}_Bif_genera > temp/${PROJECT}_selected_Bif ;
第一个 grep 工作得很好, awk 也很好。变量很好地用于给定的文件名。最后一个 grep 似乎工作不好,生成的文件名为“_selected_Bif”,因此该变量没有像以前一样使用。我试图找到一种方法来解释为什么我会遇到这个麻烦。
TL;DR 使用的文件都不为空。如果 grep 按预期工作,则名为“${PROJECT}_selected_Bif”的预期文件也不能为空。
答案1
我真的不明白为什么PROJECT
变量没有在最后一行代码中正确扩展(除非您在错误的位置查找生成的文件),但我确实看到您没有正确地双引号变量扩展。一旦$PROJECT
包含空格或换行符或任何其他 shell 特有的字符,不使用双引号就会导致问题。
您还需要克服重重困难才能完成一些可以通过单个awk
程序完成的事情:
proj=$(<temp/project_name_final)
awk 'NR==FNR { species[$3]; next } /Bifidobacterium/ && !($2 in species) { print $2 }' \
"${proj}_species.txt" "${proj}_genera.txt" >"temp/${proj}_selected_Bif"
该awk
程序读取两个文件${proj}_species.txt
和${proj}_genera.txt
。读取第一个文件时,它的第三列用于在关联数组或哈希中创建键species
。当我们开始读取第二个文件时,我们只对包含字符串的行感兴趣Bifidobacterium
,并且其第二列不是species
哈希中的键。对于这些行,我们输出第二列。
所有输出都转到temp/${proj}_selected_Bif
.
请注意变量的所有扩展的双引号proj
。我使用小写变量名,因为大写变量是为系统和 shell 环境变量保留的。
也可以看看
答案2
您的初始文件包含以 CR/LF 结尾的行。 CR 作为变量的一部分进行执行$PROJECT
,并且由于 CR 是文件名中的有效字符,因此所有中间步骤都可以正常工作。 (但文件名是“错误的”。)
最后的输出也是正确的,但文件名中的 CR 被解释为强制光标返回到行的开头,因此您看到的只是_selected_Bif
.
您可以通过在读取文件内容时剥离 CR 来证明这一点。
答案3
我已经解决了这里的问题是,没有其他指令的 grep 无法处理不排序的行。因此输出文件将为空,并且不知道为什么,grep 创建了这个空文件,但文件名错误。 (有人知道为什么吗?)
所以而不是
$ grep -v -f
我用过
$ grep -F -x -v -f