将外部参数传递进入awk命令

将shell脚本里的参数传递进入awk命令里的方法:从文件中读取,从管道传递,从shell变量中读取等,每种方法的适用不同。

把数据传入awk的方法汇总

方法1:文件

将file文件里的数据传入awk命令

awk '{print $0}' file 

当有多个文件时,可以在后面加入多个文件名

awk 'FILENAME==ARGV[1]{print $0}FILENAME==ARGV[2]{print $0}' file1 file2 

方法2:管道

通过管道将前面的数据传入awk命令

cat file | awk '{print $0}'
echo $var | awk '{print $0}'

该方法的缺点是管道命令只有一个出口,一个入口,因此只能将一组数据传入awk

方法3:变量

可以通过-v选项将外部变量var传给内部变量a,也可以在BEGIN里将外部变量var赋值给内部变量a

var=1
awk -v a="$var" 'BEGIN{print a}'
awk 'BEGIN{a='"$var"'; print a}'

当变量有多个时,可以使用多次-v选项,或者在BEGIN里多次赋值

var1=1
var2=2
awk -v a="$var1" -v b="$var2" 'BEGIN{print a,b}'
awk 'BEGIN{a='"$var1"'; b='"$var2"'; print a,b}'

方法4:以上方法的混合

管道方法和文件方法不能同时使用,其他方法均可同时使用。所以,awk可以同时输入外部变量并读取外部文件,也可以同时接收管道数据并传入外部变量。
例如计算弧长对应的距离

pi=3.14159265
radius=6371.05
awk -v r="$radius" 'BEGIN{pi='"$pi"'}{print pi*r*$1}' file | cat

参数传递的区别

使用-v和BEGIN传入参数的区别

如果传入的字符串包含数字,就有区别,一个例子可以说明

a=1/2
awk 'BEGIN{ss='"$a"'; split(ss,str,"/"); print str[1]}'  #输出0.5,因为把a视为表达式
awk -v ss="$a" 'BEGIN{split(ss,str,"/"); print str[1]}'  #输出1,因为把a视为字符串