背景资料:
我正在尝试编写一个小的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
“什么也没有发生”(某事正在运行,但是花费的时间太长,并且没有结果,因此请终止该过程)。
值得知道:
我可能是“屏幕盲人”,但我找不到原因,为什么我无法将命令行参数传递给脚本。
解决方案-查看评论
注意:通过这种方式只能找到图案在一行中的首次出现。
第二个问题:
此外,我想将要搜索的主题(字符串)作为变量。我尝试了这个:
脚本:
#!/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/