結合編輯數據文件的shell腳本學習awk傳參方式,該腳本功能:
a.取VIDEOUSR_11082017_0102_ONLINE_STASTIC.dat文件中第87個字段的低8位;
b.將每行數據的第3列和第87列對調;
3.修改后的數據生成到最新時間戳文件中。
1.常規用法
1 #!/usr/bin/bash 2 3 if [[ $# -eq 2 ]];then 4 srcfile="$1" #文件名 5 bit=$2 #低bit位 6 filetimetmp=${srcfile#*_} 7 filetime=${filetimetmp%%_*} #截取文件中時間戳,日+月+年 8 realtime=`date +"%d%m%Y"` #生成最新時間戳,日+月+年 9 let databit="2**$bit" #低bit位對應的值,通過取余截取第低bit位數值 10 if [[ -f $srcfile ]];then 11 newfile=${srcfile//$filetime/$realtime} #生成最新時間戳對應的文件 12 if [[ -f $newfile && $newfilew =~ ".dat" ]];then 13 rm -rf $newfile 14 fi 15 cat $srcfile|sed 's/ /#/'|awk -v mod=$databit -F ',' '{predata=$87%mod;$87=$3;$3=predata;print $0}'|sed 's/ /,/g'|sed 's/#/ /' >>$newfile 16 ##其中sed 's/ /#/'和sed 's/#/ /'是對數據中帶有空格時間(2017-08-11 17:30:21)做保護(編輯前空格替換為#看,編輯完后#替換為空格) 17 fi 18 fi
調用方式:sh datatransfomate.sh VIDEOUSR_11082017_0102_ONLINE_STASTIC.dat 8
awk傳參:awk -v mod=$databit,之后可以在‘{}’中使用mod變量。
但字段值不能通過變量方式進行修改,即$87和$3如何使用外部變量進行傳參。
2.${}變量傳參
1 #!/usr/bin/bash 2 3 if [[ $# -eq 4 ]];then 4 srcfile="$1" #文件名 5 exchghead=$2 #對應第3個字段 6 exchgtail=$3 #對應第87個字段 7 bit=$4 #低bit位 8 filetimetmp=${srcfile#*_} 9 filetime=${filetimetmp%%_*} #截取文件中時間戳,日+月+年 10 realtime=`date +"%d%m%Y"` #生成最新時間戳,日+月+年 11 let databit="2**$bit" #低bit位對應的值,通過取余截取第低bit位數值 12 if [[ -f $srcfile ]];then 13 newfile=${srcfile//$filetime/$realtime} #生成最新時間戳對應的文件 14 if [[ -f $newfile && $newfilew =~ ".dat" ]];then 15 rm -rf $newfile 16 fi 17 cat $srcfile|sed 's/ /#/'|awk -v mod=$databit -F ',' "{predata=\$${exchgtail}%mod;\$${exchgtail}=\$${exchghead};\$${exchghead}=predata;print \$0}"|sed 's/ /,/g'|sed 's/#/ /' >>$newfile 18 ##其中sed 's/ /#/'和sed 's/#/ /'是對數據中帶有空格時間(2017-08-11 17:30:21)做保護(編輯前空格替換為#看,編輯完后#替換為空格) 19 fi 20 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.使用總結
a.常規使用 -v 即可傳參,awk -v innerpara=$outerpara -F ',' '{print innerpara,$0}'
b.通過變量方式傳參,awk -v -F ',' "{print \$${outerpara},\$0}" ##注意使用轉譯符即可
c.以上兩種傳參方式可以同時使用