1

我正在尝试在 if 条件下将 awk 与用户定义的变量($EVENT,其中$EVENT是文件名以及文本文件中的列)一起使用,但它似乎无法识别该变量。我尝试过各种组合',',{和(但似乎没有任何效果。

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

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

4

3 回答 3

3

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

awk -v event="$EVENT" '{print event}' file
于 2013-12-02T15:46:05.390 回答
1

你可以做:

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

有关更多信息,请参阅此帖子: 如何在 awk 脚本中使用 shell 变量?

于 2013-12-02T19:00:24.280 回答
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 主体。

于 2013-12-02T15:49:08.170 回答