繁体   English   中英

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

[英]passing command line arguments to awk in shell script

背景资料:

我正在尝试编写一个小的 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 嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎好

2 CTCTCTCTCT

3 塔塔塔塔

4 CCGCGCGCGCG

5 中交中交

6 GGGGGGGGGG

7 AAAAAAAAA

8 TTTTTTTTTT

9 TGATTTTTT

10中交会

 $ ./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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM