在awk命令中使用用户设置变量

时间:2013-12-02 15:39:11

标签: if-statement awk user-defined

我正在尝试在if条件中使用awk和用户定义的变量($EVENT,其中$EVENT是文件名,也是文本文件中的列),但它不是似乎认识到变量。我尝试了各种组合',',{和(但似乎没什么用。

EVENT=19971010_1516.txt

awk '{if ($2=="$EVENT") print $3,$4,$8}' FILENAME.txt > output.txt

可以在awk命令中使用用户定义的变量吗?如果是这样,语法如何工作?

3 个答案:

答案 0 :(得分:1)

您无法在代码中直接使用$FOO,因为awk会认为它是列FOO。 (FOO是可变的)。但你的FOO是空的。要使用shell var,请使用-v,如:

awk -v event="$EVENT" '{print event}' file

答案 1 :(得分:0)

如果你想在字面上包含awk脚本中的变量,那么你需要用双引号括起脚本(单引号不扩展变量)。像awk '{if ($2=="'"$EVENT"'") print $3,$4,$8}' FILENAME.txt > output.txt'这样的东西。它在awk脚本的其余部分使用单引号,以避免需要转义 $ 字符,但随后使用双引号作为事件变量。

话虽如此,你几乎肯定希望将shell变量暴露为awk作为awk变量,这意味着你要使用-v标志来表示awk。像awk -vevent="$EVENT" '{if ($2==event) print $3,$4,$8}' FILENAME.txt > output.txt这样的东西。 (或者你可以使用类似awk '{if ($2==event) print $3,$4,$8}' event="$EVENT" FILENAME.txt > output.txt的东西。)

你也可以使用'$2 == event {print $3,$4,$8}'简化你的awk身体,让模式做他们应该做的事情。

答案 2 :(得分:0)

你可以这样做:

awk '$2==event {print $3,$4,$8}' event="$EVENT" FILENAME.txt > output.txt

awk -v event="$EVENT" '$2==event {print $3,$4,$8}' FILENAME.txt > output.txt