Bash 脚本无缘无故地停止使用变量

Bash 脚本无缘无故地停止使用变量

我被这个剧本困住了。我已经用临时文件的单个猫定义了一个变量,这些是脚本完成的以下操作。

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 

相关内容