variables - 只用几个 awk 命令将变量传递给 awk 脚本
问题描述
我对 awk 很陌生,因此为这个问题道歉。
我制作了一个包含许多 awk 命令的脚本(称为“myscript.awk”,例如:
awk -v f=5 -v t=62 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS = "\t") }' myfiles > testa3.maf
awk -v f=1 -v t=4 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS = "\t") }' myfiles > testa4.maf
paste testa3.maf testa4.maf > myfiles.txt
这只是一个例子,但真正的脚本还有很多其他的 awk 命令。我现在想将它传递给数千个文件,因此它将这些命令应用于所有文件。
我尝试将我的文件分配给一个变量(正如我在脚本中显示为 myfile 一样)并这样运行:
awk -v myfiles="test.maf" -f myscript.awk
但我收到语法错误。我一定是做错了什么!
谢谢
解决方案
您需要区分 shell 脚本和 awk 脚本。在你的情况下,
awk -v f=1 -v t=4 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS = "\t") }' testa.maf > testa4.maf
是一个shell命令。您发布的三个命令是一个 shell 脚本。这是上述 shell 脚本正在执行的 awk 脚本:
{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS = "\t") }
如果您将该脚本命名为script.awk
. 你可以使用awk -v f=1 -v t=4 -f script.awk
. Shell 脚本不是由 执行的awk
,而是(通常)由sh
or执行的bash
。
Shell 脚本也可以有变量,但它们的功能与 awk 变量不同。具体来说,如果您希望该 shell 脚本有一个用于输出文件的变量,您可以这样做:
file="$1"
awk -v f=5 -v t=62 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS = "\t") }' $file > testa3.maf
awk -v f=1 -v t=4 '{ for (i=f; i<=t;i++) printf("%s%s", $i,(i==t) ? "\n" : OFS = "\t") }' testa.maf > testa4.maf
paste testa3.maf testa4.maf > $file.txt
这里,$1
是第一个传递的参数;然后你可以调用你的脚本:
bash script.sh test.maf
推荐阅读
- report - 以与数据带不同的方面显示数组
- html - 将 Ul 置于页脚中心
- angular - 分页在 mat-paginator (Angular 7) 中的第一次加载时不起作用
- c++ - 如何修复 eigen3 中的“非类型模板参数不是常量表达式”?
- c# - 在 ASP.NET Core MVC 3.0 中找不到嵌入式 cshtml
- json - 如何在颤动中解析二维列表的json
- javascript - 在 react.js 中传递属性/添加到收藏夹
- python - 使用 LineStrings 将 CSV 转换为 Geojson
- postgresql - 如何修改 EF-Core Database-First (PostgreSQL) 项目以同时使用 SQLite 和 Xamarin.Forms
- testing - 有没有办法让 testcafe 使用 sso 登录?