我使用下面的命令来删除字段值中的换行符。此示例命令是为具有 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
为字符串。它将保留该值,直到该值更改为处理之前。请注意,以这种方式设置的变量在代码中的任何块内都不可用。hello
file1
good bye
file3
BEGIN
awk
awk
通过构成代码的字符串中的变量扩展将shell 变量直接注入到代码中并不是将数据传输到awk
程序中的好方法,应该避免。