在 shell 脚本中将命令行参数传递给 awk

passing command line arguments to awk in shell script

背景资料:

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

脚本(search.sh):

#!/bin/bash

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

命令行调用:

$ ./search.sh

第一个问题:

当我将脚本更改为:

awk 's=index([=13=], "CAATCTCC"){print "line=" NR, "start position=" s}' 

并在我的 bash 中执行以下命令行调用:

$ ./search.sh 100nt_upstream_of_mTSS.fas

"nothing" 发生了(有些事情是 运行,但它花费的时间太长,没有结果出现,所以终止该过程)。

值得知道:

我可能是 "screen blind",但我找不到无法将命令行参数传递给我的脚本的原因。


解决方案 - 查看评论

注意:这种方式只会找到一行中第一次出现的模式。


第二题:

此外,我想使我搜索的主题(字符串)成为变量。我试过这个:

脚本:

#!/bin/bash
FILE=
MOTIF=
awk 's=index([=15=], "$MOTIF"){print "line=" NR, "start position=" s}' "$FILE"

命令行调用:

$ ./search.sh 100nt_upstream_of_mTSS.fas CAATCTCC

想法:第一个命令行参数有效并被正确替换。为什么第二个没有正确替换?

目前解决方案:

脚本:

#!/bin/bash
file=
awk -v s="" 'i=index([=17=], s){print "line: " NR, "pos: " i}' "$file"

测试:

测试文件(test.txt):

1 嘎嘎嘎嘎

2 CTCTCTCTCT

3 TATATATATA

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=
awk 's=index([=10=], "CAATCTCC"){print "line=" NR, "start position=" s}' "$variable"

./search.sh 100nt_upstream_of_mTSS.fas