背景资料:

我正在尝试编写一个小的Shell脚本,该脚本在.fas文件中搜索模式(字符串)并打印找到模式的行和位置。当我调用Shell脚本时,以下代码段有效:

脚本(search.sh):

#!/bin/bash

awk 's=index($0, "CAATCTCC"){print "line=" NR, "start position=" s}' 100nt_upstream_of_mTSS.fas

命令行调用:
$ ./search.sh

第一个问题:

当我将脚本更改为:
awk 's=index($0, "CAATCTCC"){print "line=" NR, "start position=" s}'

并在我的bash中执行以下命令行调用:
$ ./search.sh 100nt_upstream_of_mTSS.fas

“什么也没有发生”(某事正在运行,但是花费的时间太长,并且没有结果,因此请终止该过程)。

值得知道:
  • 我在search.sh所在的目录中
  • 也位于文件100nt_upstream_of_mTSS.fas中
  • search.sh是可执行的

  • 我可能是“屏幕盲人”,但我找不到原因,为什么我无法将命令行参数传递给脚本。

    解决方案-查看评论

    注意:通过这种方式只能找到图案在一行中的首次出现。

    第二个问题:

    此外,我想将要搜索的主题(字符串)作为变量。我尝试了这个:

    脚本:
    #!/bin/bash
    FILE=$1
    MOTIF=$2
    awk 's=index($0, "$MOTIF"){print "line=" NR, "start position=" s}' "$FILE"
    

    命令行调用:
    $ ./search.sh 100nt_upstream_of_mTSS.fas CAATCTCC
    

    想法:第一个命令行参数起作用并且被正确替换。为什么第二个替换不正确?

    到目前为止的解决方案:

    脚本:
    #!/bin/bash
    file=$1
    awk -v s="$2" 'i=index($0, s){print "line: " NR, "pos: " i}' "$file"
    

    测试:

    测试文件(test.txt):

    1 GAGAGAGAGA

    2 CTCTCTCTCT

    3塔塔塔塔

    4 CGCGCGCGCG

    5 CCCCCCCCCC

    6 GGGGGGGGGG

    7 AAAAAAAAAA

    8 TTTTTTTTTT

    9 TGATTTTTTT

    10 CCCCCCCCGA
     $ ./search.sh test.txt GA
    

    将打印:

    行:1位置:1

    行:4位置:2

    行:6位置:1

    行:9位置:2

    行:10位置:9

    该脚本将仅在模式的第一个字符的行中打印行和第一个匹配位置。我如何设法打印所有结果并使用完整图案?

    最佳答案

    据我了解,您想将Input_file(您要通过脚本处理的文件)作为参数传递,如果是这种情况,那么下面的内容可能会帮助您。

    cat search.sh
    #!/bin/bash
    variable=$1
    awk 's=index($0, "CAATCTCC"){print "line=" NR, "start position=" s}' "$variable"
    
    ./search.sh 100nt_upstream_of_mTSS.fas
    

    关于linux - 在shell脚本中将命令行参数传递给awk,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46872318/

    10-14 16:17
    查看更多