2

我正在使用以下命令从字符串中的某些位置提取字符:

left=1; right=4; grep ETM21CH01EPU3Z -A1 SLf_454.fna | tail -n 1 | awk '{print substr($0,1,4)}'

并得到这个正确的输出:

GTTG

现在我想用bash 变量leftright中的值替换14

我试过这个:

left=1; right=4; grep ETM21CH01EPU3Z -A1 SLf_454.fna | tail -n 1 | awk -v l=$left r=$right '{print substr($0,l,r)}'

awk:命令。行:1:致命:无法打开文件 `{print substr($0,l,r)}' 进行读取

请问有什么建议吗?谢谢。

编辑:从下面的评论中复制,所以我们可以实际阅读它:

好吧,我还有一个文件,其中写有要搜索的内容(例如 ETM21CH01EPU3Z)和位置。所以整个代码是:

while read -r line; do
   echo $line;
   name=`echo $line | cut -d' ' -f 1`;
   left=`echo $line | cut -d' ' -f 2`;
   right=`echo $line | cut -d' ' -f 3`;
   grep $name -A1 SLf_454.fna | tail -n 1 | awk -v l=$left -v r=$right '{print substr($0,l,r)}';
done < CL6o_blastoutput_SLf_454.fna_out 
4

2 回答 2

3

@dogbane 为您提供了您要求的具体答案,但您不需要那长长的命令和管道链,只是在找到某种模式后打印该行的前 4 个字符。试试这个:

left=1; right=4; awk -v l="$left" -v r="$right" 'f{print substr($0,l,r);f=0} /ETM21CH01EPU3Z/{f=1}' SLf_454.fna

显然,如果这就是您使用它们的全部,您也不需要左右 shell 变量:

awk -v l="1" -v r="4" 'f{print substr($0,l,r);f=0} /ETM21CH01EPU3Z/{f=1}' SLf_454.fna

编辑:我将您的命令复制到您的原始问题中,以便我们可以阅读您的脚本。

试试这个(未经测试):

awk -F, '
NR==FNR { left[$1]=$2; right[$1]=$3; next }
{
   for (name in found) {
      print substr($0,left[name],right[name])
      delete found[name]
   }
   for (name in left) {
      if ($0 ~ name) {
         found[name]
      }
   }
}
' CL6o_blastoutput_SLf_454.fna_out SLf_454.fna
于 2013-01-29T14:49:02.927 回答
2

您在变量-v之前缺少 a 。right您要传入的每个变量都awk必须以-v.

将其更改为:

awk -v l=$left -v r=$right '{print substr($0,l,r)}'
于 2013-01-29T14:43:41.750 回答