将外部参数传入awk命令的方法汇总
将外部参数传递进入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视为字符串
本文来自博客园,作者:Philbert,转载请注明原文链接:https://www.cnblogs.com/liangxuran/p/17181786.html