【问题标题】:Where are the simple AWK examples to get started?从哪里开始使用简单的 AWK 示例?
【发布时间】:2010-10-06 01:52:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: awk


    【解决方案1】:

    首先,你不要在 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, ... 作为文件。

    【讨论】:

    • 不同的数组呢?我可以将不同数组的元素彼此分开,例如:1 DIVIDE 2 2 DIVIDE 4 => 0,5 0,5 可能吗?
    【解决方案2】:

    首先,基本的 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] 的数组中添加任何内容,因此它不会打印任何内容。

    【讨论】:

      【解决方案3】:

      试试:

      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 tutorial.

      【讨论】:

        【解决方案4】:

        我用这本书site. O'Reilly Sed & Awk 这本书也不错。

        【讨论】:

          【解决方案5】:

          还有很多有用的信息和教程http://awk.info

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-12-03
            • 1970-01-01
            • 1970-01-01
            • 2023-04-04
            • 2011-08-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多