我通常不会使用bash,但在这种情况下,grep可能是一个非常快速的解决方案。我在bash中已经阅读了很多关于grep和变量赋值的问题,但是我没有看到错误。我在$ pattern周围尝试了几种双引号,使用````或$(...)但没有任何效果。
所以这就是我尝试做的事情: 我有两个文件。第一个包含几个名字。我想将它们中的每一个用作grep的模式,以便在另一个文件中搜索它们。因此,我遍历第一个文件的行并将名称分配给变量模式。 此步骤适用于正确打印变量。 但不知何故,grep无法识别/解释变量。当我用实际名称替换“$ pattern”时,一切都很好。因此,我不认为变量赋值有问题,但将“$ pattern”解释为它应该表示的字符串。
非常感谢任何帮助!
#!/bin/bash
while IFS='' read -r line || [[ -n $line ]]; do
a=( $line )
pattern="${a[2]}"
echo "Text read from file: $pattern"
var=$(grep "$pattern" 9606.protein.aliases.v10.txt)
echo "Matched Line in Alias is: $var"
done < "$1"
> bash match_Uniprot_StringDB.sh ~/Chromatin_Computation/.../KDM.protein.tb
输出:
Text read from file: "UBE2B"
Matched Line in Alias is:
Text read from file: "UTY"
Matched Line in Alias is:
修改 解决方案drvtiny建议工作。有必要摆脱双引号来匹配字符串。添加以下行使脚本工作。
pattern="${pattern#\"}"
pattern="${pattern%\"}"
答案 0 :(得分:1)
请查看&#34; -f FILE&#34; man grep中的选项。 我建议这个选项完全符合你的需要,不需要任何bash循环或其他&#34; hacks&#34; :)
是的,根据您的代码输出,您可以读取包含双引号的模式。换句话说,你从文件〜/ Chromatin_Computation /.../ KDM.protein.tb中读取这个字符串:
"UBE2B"
但不是
UBE2B
也许您需要删除$ pattern边界上的双引号?
阅读模式后尝试执行此操作:
pattern=${pattern#\"}
pattern=${pattern%\"}