zoukankan      html  css  js  c++  java
  • awk向脚本传递參数(二)

    命令行參数的一个重要限制是它们在BEGIN过程中是不可用的。也就是说,直到首行输入完毕以后它们才可用。为什么?这是一个easy混乱的部分。

    从命令行传递的參数就好像文件名称一样被处理。

    赋值操作知道这个变量(假设它是一个文件名称)被求值时才进行。

    參阅以下的脚本。该脚本将变量n设置为一个命令行參数。

    awk ' BEGIN { print n }
    if (n == 1) print "Reading the first file"
    if (n == 2) print "Reading the second file"
    }'
     n=1 test n=2 test2

    这里有4个命令行參数: "n=1 "、"test" 、"n=2 "和"test2"。假设你如今还记着BEGIN过程即"在处理输入之前所要做的",你将会理解为什么在BEGIN过程中的參数n返回值为空,因此print语句将打印一个空行。假设第一个參数是一个文件而不是一个变量赋值。

    该文件会知道BEGIN过程运行后才被打开。

    第一个參数为变量n赋初值1 ,第二个參数提供了文件名称。

    因此,对于test中的每一行。条件"n==1 "都为真。在读完test中的全部行之后,计算第三个參数,并将n赋值为2 。最后,第四个參数提供了第二个文件名称。

    这时在主过程中的条件"n==2"为真。

    以这样的方法对參数求值的后果是不能用BEGIN过程測试或检验命令行提供的參数。

    仅仅有当输入一行后它们才可以使用。要了解这样的局限性,可以通过编写规则"NR==1"并使用它的过程来检验參数的赋值。

    还有一个方法是在调用awk之前在shell脚本中測试命令行參数。

    POSIX awk提供了一个解决问题的方法。即在不论什么输入被读入前定义參数。用-v选项指定要在运行BEGIN 过程之前得到变量赋值(也就是。在读入第一个输入行之前)。

    -v选项必须在一个命令行脚本前说明。比如:下列命令使用-v选项为多行记录设置记录分隔符。

    $ awk -F' " -v RS="" '{ print }' phones.block

    每一个传递给程序的变量赋值都须要一个不同的-v选项。

    和C程序语言类似,awk也提供系统变量ARGC和ARGV。由于这须要了解数组,我们将在第八幸"条件、循环和数组"中讨论这些特点。

  • 相关阅读:
    debian安装后sudo不能用的问题
    分组筛选数据,某个数据字段比如说患者就诊超过一次的,身份证号会重复出现的,sql语句,备忘用的
    《精通Git》翻译系列(二)
    配置mysql允许远程连接
    raspberry pi下使用mp3blaster播放mp3音乐
    MSSQL常用语句备注1
    设计的四大原则
    在树莓派下安装mysql的相关查询记录
    查看数据库日志,收缩数据库
    芒果功效与作用
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7270617.html
Copyright © 2011-2022 走看看