设为首页 加入收藏

TOP

awk知识点全回顾(六)
2017-10-13 10:37:21 】 浏览:6388
Tags:awk 知识点 回顾
le循环的判断条件是0和非0,所以"-1"也会进入死循环。所以,安全的写法为:

while (getline <"file" >0){
    cmd...
}

12.向awk传递变量

awk很重要且必备的能力是接受外界的变量,例如shell中的变量,shell中命令执行的结果,或者是在开始执行awk前应该初始化的变量。

例如,在shell中定义一个变量name,传递给awk使用。

awk -v awk_name="$name" 'BEGIN{print awk_name}' 
Ma longshuai

有三种方式可以向awk传递变量:

1.将待传递变量当作文件名被awk解析。awk识别后发现是赋值语句,就认为其是变量传递。变量赋值语句必须定义awk program之后。此法定义的变量不可在BEGIN中使用,因为它是被当成文件解析的,只有在需要读取主输入文件的时候才会被解析。

awk 'BEGIN{}PATTERN{print var1,var2,var3}' var1=value1 var2=value2 file1 var3=value3 var1=value4 file2

在上面的语句中,当awk执行完BEGIN程序后,准备读取主输入,于是开始解析program后的输入文件。解析时发现,var1和var2都是赋值语句,于是当成变量处理,当读取到file1时,发现只有一个参数,则当作输入文件,于是开始处理该文件。在处理file1时,var1和var2都是有效的,但var3还未赋值,因此var3无效。当处理完file1后,继续解析下一个主输入文件,此时var3被赋值,并开始处理file2。在处理file2时,var1、var2和var3都是有效的,但var1被新值覆盖。

此外,还可以将shell命令的结果赋值给这些预定义变量。如下展示了几种变量定义的方式:

name="Ma longshuai"
awk 'program' OFS=":" var1="$name" var2="`echo Ma longshuai2`" var3="Ma longshuai3" var4=Malongshuai4 filename

不仅可以定义普通变量,还可以定义内置变量(如上OFS)。注意加引号的方式:为了安全,应该对所有赋值语句的value部分加上双引号,除非所赋的值不包含特殊字符。所以,如果上面的var1赋值语句写成var1=$name,将被awk解析成var1=Ma longshuai,于是var1的值为Ma,主输入文件为longshuai。

 

2.使用"-v"选项传递。变量赋值语句必须定义在awk program之前。这种方法定义的变量可以在BEGIN程序中使用。

除了定义在program之前,定义方式同上。每定义一个变量,都需要使用一个"-v"选项。如:

name="Ma longshuai"
awk -v OFS=":" -v var1="$name" -v var2="`echo Ma longshuai2`" -v var3="Ma longshuai3" 'program' filename

 

3.通过参数数组ARGV的方式。

ARGV是内置的数组变量。awk内部会将命令行切分,并按规则将各参数存放到ARGV数组中,数组下标从0开始,这是awk中唯一下标从0开始的数组。在存放到ARGV时,所有的选项和program会被忽略。

每存储一个数组变量,特殊变量ARGC的值增加1。因此ARGC的值代表的是参数的个数。所以,数组变量从ARGV[0]到ARGV[ARGC-1]。

可使用类似下面的循环来遍历ARGV数组。

awk -F "\t" -v var1="value1" 'BEGIN{ for(i=0;i<ARGC;++i){ print "ARGV[" i "]: " ARGV[i] } print "ARGC: " ARGC }' "a" "b" "v=1" file 
  ARGV[0]: awk
  ARGV[1]: a
  ARGV[2]: b
  ARGV[3]: v=1
  ARGV[4]: file
  ARGC: 5

注意,ARGV[0]存储的是awk命令,"-F"和"-v"选项都没有存储到ARGV中。

ARGC和ARGV数组变量的值都可以手动修改。命令行分割存储完成之后,开始处理BEGIN,再处理主循环输入。因此,在BEGIN中修改ARGV中输入文件对应的值,可以改变awk所读取的输入文件,若将其设置为空,则该数组变量直接被跳过,也就不再读取该输入文件。

需要注意的是,当增加ARGV元素时,必须同时递增ARGC的值,因为awk是根据AGRC来读取ARGV的。同理,只增加ARGC的值,将导致新建ARGV数组元素,且这些新元素的值为空。也因此,如果减小ARGC的值,将导致无法访问超出ARGC-1边界的ARGV元素。

 

回到系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/7509812.html

注:若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢!