免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5668 | 回复: 3
打印 上一主题 下一主题

[学习共享] 向awk传递外部参数的四个方法总结(直接传递、-v选项、ARGV数组、间接引用) [复制链接]

论坛徽章:
1
技术图书徽章
日期:2016-02-03 16:35:25
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-12-11 20:07 |只看该作者 |倒序浏览
本帖最后由 陈卓文 于 2015-12-14 15:45 编辑

(一)直接传递
参数写在输入文本之前,脚本之后
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脚本结束




小弟在学习awk总结了4个方法,大家还有其他办法可以相互讨论学习!谢谢~

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2015-12-12 11:51 |只看该作者
还可以利用"" ''的中的变量替代
gawk可以使用ENVIRON调用环境变量

论坛徽章:
1
技术图书徽章
日期:2016-02-03 16:35:25
3 [报告]
发表于 2015-12-12 12:16 |只看该作者
有没有具体实例啊
回复 2# waker


   

论坛徽章:
1
技术图书徽章
日期:2016-02-03 16:35:25
4 [报告]
发表于 2015-12-14 15:30 |只看该作者
waker指点的用法

(五)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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP