向awk传递外部参数的五种方法(直接传递;-v选项;ARGV数值;间接引用;ENVIRON变量)

本文详细介绍了如何在awk中通过五种方式传递外部参数:直接写入、使用-v选项、利用ARGV数组、间接引用变量以及通过ENVIRON环境变量。讨论了每种方法的优缺点和适用场景。
摘要由CSDN通过智能技术生成

向awk传递外部参数的五种方法(直接传递;-v选项;ARGV数值;间接引用;ENVIRON变量)
向awk传递外部参数的方法有四:

#(一)直接传递
参数写在输入文本之前,脚本之后

awk 'Script' var=value inputfile    #单个参数
awk -f scriptfile var1=value1 var2=value2 inputfile   #多个参数

缺点:命令行参数的限制是他们在BEGIN过程中是不可用的,直到首行输入完成以后它们才可用。BEGIN是在首行输入前执行。

$  echo | awk 'BEGIN{print n}' n=1  
# 此命令打印出空,并没有打印1

#(二)-v选项
-v 选项,指定在任何输入被读入前定义参数 #指定执行BEGIN前的变量赋值
例子:

awk -v var=value  inputfile
$  echo | awk -v n=1 'BEGIN{print n}'
1        

#(三)系统内置变量ARGV数组
ARGV[N],ARGV[0]为awk,下标从1开始是输入的参数。
例子:

$ echo | awk 'BEGIN{print ARGV[0]}' var1  
awk
$    echo | awk 'BEGIN{print ARGV[1]}' var1  var2
var1
$    echo | awk 'BEGIN{print ARGV[2]}' var1  var2
var2

#(四)间接引用 $${VAR}
间接变量引用避免了在一个内嵌awk脚本中引用shell变量的混乱行为

例子:

#!/bin/bash
 # 这是" 求文件中指定列的总和" 脚本的另一个版本,
 #+ 这个脚本可以计算目标文件中指定列( 此列的内容必须都是数字) 的所有数字的和.
 # 这个脚本使用了间接引用.
 ARGS=2
 E_WRONGARGS=65
  if [ $# -ne "$ARGS" ] # 检查命令行参数的个数是否合适.
  then
   echo "Usage: `basename $0` filename column-number"
   exit $E_WRONGARGS
  fi

  filename=$1
  column_number=$2  ######使用时指定计算列数######

  # awk脚本开始.
  # ------------------------------------------------
  awk "  #注意此处为双引号
 
  { total += \$${column_number} # 间接引用,先将列数的变量替换得到$N,$N对应awk的列数
  }
  END {
   print total
   }
   " "$filename"
  # ------------------------------------------------
  # awk脚本结束.
  exit 0

另一解决办法:

  awk -v N=$column_number " #传递了column_number给N变量到awk中
 
  { total += \$N    # N 先替换为变量$column-number指定数字,再执行$number执行列数
  }
  END {
   print total
   }
   " "$filename"
  # ------------------------------------------------
  # awk脚本结束.

#(五)export结合ENVIRON变量

#!/bin/bash
 
 # 这是" 求列的和" 脚本的另外一个版本(col-totaler.sh)
 # 这个版本将把一个变量通过export的形式传递到'awk' 中 . . .
 #+ 并且把awk脚本放到一个变量中.
 
 
 ARGS=2
  E_WRONGARGS=65
 
  if [ $# -ne "$ARGS" ] # 检查命令行参数的个数.
  then
   echo "Usage: `basename $0` filename column-number"
   exit $E_WRONGARGS
  fi
 
  filename=$1
  column_number=$2
 
  #===== 上边的这部分, 与原始脚本完全一样 =====#


  export column_number
  # 将列号export出来, 这样后边的进程就可用了.




  # -----------------------------------------------
  awkscript='{ total += $ENVIRON["column_number"] }
  END { print total }'
  # 是的, 变量可以保存awk脚本.
  # -----------------------------------------------


  # 现在, 运行这个awk脚本.
  awk "$awkscript" "$filename"


  exit 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值