牛下载:绿色软件官方软件免费下载基地!
所在位置:首页 > 新闻资讯 > awk中引用变量的两种方式

awk中引用变量的两种方式

发布时间:2020-04-22 14:56:21来源:阅读:

结合编辑数据文件的shell脚本学习awk传参方式,该脚本功能:

取VIDEOUSR_11082017_0102_ONLINE_STASTIC.dat文件中第87个字段的低8位;

将每行数据的第3列和第87列对调;

修改后的数据生成到最新时间戳文件中。

1、常规用法

#!/usr/bin/bash

if [[ $# -eq 2 ]];then
  srcfile="$1" #文件名
  bit=$2 #低bit位
  filetimetmp=${srcfile#*_}
  filetime=${filetimetmp%%_*} #截取文件中时间戳,日+月+年
  realtime=`date +"%d%m%Y"` #生成最新时间戳,日+月+年
  let databit="2**$bit" #低bit位对应的值,通过取余截取第低bit位数值
  if [[ -f $srcfile ]];then
    newfile=${srcfile//$filetime/$realtime} #生成最新时间戳对应的文件
    if [[ -f $newfile && $newfilew =~ ".dat" ]];then
       rm -rf $newfile
    fi
       cat $srcfile|sed 's/ /#/'|awk -v mod=$databit -F ',' '{predata=$87%mod;$87=$3;$3=predata;print $0}'|sed 's/ /,/g'|sed 's/#/ /' >>$newfile
       ##其中sed 's/ /#/'和sed 's/#/ /'是对数据中带有空格时间(2017-08-11 17:30:21)做保护(编辑前空格替换为#看,编辑完后#替换为空格)
  fi
fi

调用方式:

sh datatransfomate.sh VIDEOUSR_11082017_0102_ONLINE_STASTIC.dat 8

awk传参:awk -v mod=$databit,之后可以在‘{}’中使用mod变量。

但字段值不能通过变量方式进行修改,即$87和$3如何使用外部变量进行传参。

2、${}变量传参

#!/usr/bin/bash

if [[ $# -eq 4 ]];then
  srcfile="$1" #文件名
  exchghead=$2 #对应第3个字段
  exchgtail=$3 #对应第87个字段
  bit=$4 #低bit位
  filetimetmp=${srcfile#*_}
  filetime=${filetimetmp%%_*} #截取文件中时间戳,日+月+年
  realtime=`date +"%d%m%Y"` #生成最新时间戳,日+月+年
  let databit="2**$bit" #低bit位对应的值,通过取余截取第低bit位数值
  if [[ -f $srcfile ]];then
     newfile=${srcfile//$filetime/$realtime} #生成最新时间戳对应的文件

    if [[ -f $newfile && $newfilew =~ ".dat" ]];then
       rm -rf $newfile
    fi
       cat $srcfile|sed 's/ /#/'|awk -v mod=$databit -F ',' "{predata=$${exchgtail}%mod;$${exchgtail}=$${exchghead};$${exchghead}=predata;print $0}"|sed 's/ /,/g'|sed 's/#/ /' >>$newfile
       ##其中sed 's/ /#/'和sed 's/#/ /'是对数据中带有空格时间(2017-08-11 17:30:21)做保护(编辑前空格替换为#看,编辑完后#替换为空格)
  fi
fi

调用方式:

sh datatransfomate.sh VIDEOUSR_11082017_0102_ONLINE_STASTIC.dat 3 87 8

awk传参:由于使用了“”,shell会对“”中$进行索引替换,因此需要对部分$进行转译。

awk中“”经过shell处理后会转换:

awk -v mod=$databit -F ',' "{predata=$${exchgtail}%mod;$${exchgtail}=$${exchghead};$${exchghead}=predata;print $0}"

                                                    ==》awk -v mod=$databit -F ',' ‘{predata=$87%mod;$87=$3;$3=predata;print $0}’

3、使用总结

常规使用 -v 即可传参,awk -v innerpara=$outerpara -F ‘,’ ‘{print innerpara,$0}’

通过变量方式传参,awk -v -F ‘,’ “{print $${outerpara},$0}” ##注意使用转译符即可

以上两种传参方式可以同时使用

反对
收藏
  • 热门资讯
  • 最新资讯
  • 应用排行榜
  • 游戏排行榜