【问题标题】:pass bash variable to awk in order to extract characters at certain positions将 bash 变量传递给 awk 以提取特定位置的字符
【发布时间】:2013-01-29 14:41:28
【问题描述】:

我正在使用这个命令从字符串的某些位置提取字符:

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:命令。 line: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 

【问题讨论】:

    标签: bash awk character extract


    【解决方案1】:

    @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 变量,显然您也不需要左右 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
    

    【讨论】:

    • 嗯,我还有一个文件,其中写有要搜索的内容(例如 ETM21CH01EPU3Z)以及在哪些位置。所以整个代码是: while read -r line;回声 $line;名称=`回声 $line |剪切-d''-f 1`;左=`回声 $line |剪切 -d' ' -f 2; right=echo $line |剪切-d''-f 3`; grep $name -A1 SLf_454.fna |尾-n 1 | awk -v l=$left -v r=$right '{print substr($0,l,r)}';完成
    【解决方案2】:

    您在 right 变量之前缺少一个 -v。您要传递给awk 的每个变量都必须以-v 开头。

    改成:

    awk -v l=$left -v r=$right '{print substr($0,l,r)}'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 2016-02-09
      • 2020-06-30
      • 2014-09-13
      • 1970-01-01
      相关资源
      最近更新 更多