2

我所有的代码都失败了。他们应该分别打印“he”、“hello”和“5 \n 3”:

awk -v e='he' {print $e}       // not working, why?
awk NF { print hello }
awk { print ARGV[5,3] }

有一些关于 AWK 的简单例子吗?

4

5 回答 5

3

首先,你不要在 awk 中使用 $ 作为变量,试试这个:

fury> echo | awk -v e='he' '{print e}'
he

第二,你的条件 NF 意味着 NF!=0 所以它只会打印非空行:

fury> echo | awk 'NF {print "hello"}'
fury> echo "7 8" | awk 'NF {print "hello"}'
hello

我从未见过您的第三个语法,ARGV 是一维数组,因此您可以使用:

fury> awk 'BEGIN {print ARGV[5]}' 1 2 3 4 5 6 7
5
fury> awk 'BEGIN {print ARGV[5] "\n" ARGV[3]}' 1 2 3 4 5 6 7
5
3

请注意,我在第三个中使用 BEGIN 块,否则它将尝试将 1、2、3、... 作为文件打开和处理。

于 2009-02-06T23:31:36.357 回答
3

首先,基本的 shell 脚本健全性:

  • 始终将您的脚本用单引号引起来

请注意,脚本是单个参数 - 或带有 ' -f file' 的文件名。

awk 脚本是一系列 ' <pattern> <action>' 对。为了清楚起见,动作用大括号 ' {}' 括起来 - 再次保持理智。

正如 Pax 所说,第一个例子应该是:

awk -v -e e='he' '{ print e }'

第二个例子是不可思议的——你可能的意思是:

awk '{ print "hello" }'

变量 NF 是行中的字段数。你可能会得到 awk 来解释

awk 'NF { print "hello" }'

好像输入行上有任何数据(NF!= 0,或字段数不为零),然后打印'hello'。

最后一个例子同样令人费解。ARGV 是 'awk' 的参数数组,命令行没有提供任何参数。但它是一个一维数组。您的下标符号希望将其视为 Python 字典或 Perl 哈希,并结合了两个索引。没关系 - awk 支持关联数组;但由于您没有在 ARGV[5,2] 的数组中添加任何内容,因此它不会打印任何内容。

于 2009-02-07T00:22:18.813 回答
2

尝试:

echo "hello" | awk ' {print $0} '
echo "hello" | awk ' {print $1} '

注意 $0 返回整个记录,$1 只是第一个条目;awk 的计数器从 1 开始。所以

echo "hello1 hello2 hello3" | awk ' {print $0} '

返回 hello1 hello2 hello3。尽管

echo "hello1 hello2 hello3" | awk ' {print $3} '

将返回 hello3

我喜欢这个awk 教程。

于 2009-02-07T00:22:05.087 回答
1

我使用这个网站。O'Reilly Sed & Awk的书也不错。

于 2009-02-06T23:38:33.740 回答
1

此外,http://awk.info上有很多有用的信息和教程

于 2009-08-31T16:38:43.860 回答