我有一个包含以下几行的文件(temp_4n.in):
5 C 172.0696
5 C 135.6942
5 H 30.9062
5 H 31.8124
12 H 31.0377
12 O 293.0612
12 H 32.4678
我有一个脚本(testsc.txt),它将提取以某个数字开头的行的最后一个 H,我将定期更改该数字:
grep $'^${mold}\tH' temp_4n.in | tail -1 > temp_5n.in
但是,当我使用以下命令运行脚本(例如想要以 12 开头的行)时,它会失败:
qsub -v mold=12 ./testsc.txt
我认为这与 grep 命令中的第一个“$”被视为参数并被错误地替换有关。谁能帮我找出问题所在吗?
答案1
qsub -v varname=value
设置varname
为value
提交的作业环境中提供的。
在您提交的脚本中,您在命令中使用此值grep
,但包含该变量的字符串用单引号引起来,以防止 shell 扩展它。
你的脚本应该使用
grep "^$mold[[:blank:]]H" temp_4n.in | tail -1 > temp_5n.in
此处不需要$
代码中的首字母( ),而是使用它来匹配空格或制表符。$'...'
[[:blank:]]
另一种方法是awk
在您的脚本中使用:
awk -v mold="$mold" '$1 == mold && $2 == "H" { this = $0 } END { print this }' temp_4n.in >temp_5n.in
这使用字符串比较(不是正则表达式)来测试第一列和第二列,当找到匹配行时,整行将保存在变量中this
。最后,this
打印 的最后一个值。这取代了grep
和tail
。