首页 > 解决方案 > 只用几个 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

但我收到语法错误。我一定是做错了什么!

谢谢

标签: variablesawk

解决方案


您需要区分 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,而是(通常)由shor执行的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

推荐阅读