Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46974
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-16 18:43
文章分类

全部博文(14)

文章存档

2016年(6)

2015年(8)

我的朋友

分类: LINUX

2015-12-11 20:01:57

向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


阅读(6377) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~