如何在 AWK 命令运行时赋值

如何在 AWK 命令运行时赋值

我使用下面的命令来删除字段值中的换行符。此示例命令是为具有 3 个属性的文件创建的。

awk -F\| '{while(NF<3 && getline p)$0=$0 p}1'

我的输入文件具有不同数量的属性,因此我想在 AWK 命令中参数化属性值的数量。我尝试如下但出现错误。

NoAttributes=12
awk -F\| '{while(NF<$NoAttributes && getline p)$0=$0 p}1'

错误详情:

awk:字段不正确。

输入行号为1。

源行号为1。

答案1

awk要在命令行上设置变量,请使用-v variable=value

awk -v attrs=2 '{ ... NF < attrs && ... }'

您还可以通过在代码ENVIRON["variable"]中使用来访问环境变量awk

export attrs=2
awk '{ ... NF < ENVIRON["attrs"] && ... }'

或者,

attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'

或者,

env attrs=2 awk '{ ... NF < ENVIRON["attrs"] && ... }'

最后两个变体不会attrs在调用环境中设置,仅针对awk程序(以及它可能启动的任何进程)。

第三种方法是variable=value作为“文件名”参数给出:

awk '...' msg="hello" file1 file2 msg="good bye" file3 file4

这会在开始处理文件之前将awk变量设置msg为字符串。它将保留该值,直到该值更改为处理之前。请注意,以这种方式设置的变量在代码中的任何块内都不可用。hellofile1good byefile3BEGINawk

awk通过构成代码的字符串中的变量扩展将shell 变量直接注入到代码中并不是将数据传输到awk程序中的好方法,应该避免。

相关内容