在 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" 发生了(有些事情是 运行,但它花费的时间太长,没有结果出现,所以终止该过程)。
值得知道:
- 我在search.sh所在的目录
- 文件 100nt_upstream_of_mTSS.fas 也位于那里
- search.sh 可执行
我可能是 "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
背景资料:
我正在尝试编写一个小的 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" 发生了(有些事情是 运行,但它花费的时间太长,没有结果出现,所以终止该过程)。
值得知道:
- 我在search.sh所在的目录
- 文件 100nt_upstream_of_mTSS.fas 也位于那里
- search.sh 可执行
我可能是 "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