藍森林首頁 | 返回主頁 | 本站地圖 | 站內搜索 | 聯繫信箱 |
 您目前的位置:首頁 > 自由軟件 > 技術交流 > 應用編程


    

藍森林 http://www.lslnet.com 2006年6月26日 11:18


請教:如何在AWK中調用shell腳本,並在shell中使用AWK的變量

例如:有一文本list
[code]
#cat list
aaaa 123456.12 800001
bbbb 654321.22 800002
ccccc 124686554 800003
dddd -45846456.12 800004
[/code]
希望能生成一個新的文本newlist,效果如下
[code]
#cat newlist
aaaa 123,456.12 800001
bbbb 654,321.22 800002
ccccc 124,686,554.00 800003
dddd -45,846,456.12 800004
[/code]
現有數字處理腳本tho.sh:
[code]
#cat sho.sh
if test `echo $1 | grep '\.'`
        then
                head=`echo $1 | cut -d. -f 1`
                end=`echo $1 | cut -d. -f 2`
                total=`echo $head | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'`.$end
        else
                total=`echo $1 | sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'`.00
fi
echo $total
[/code]
腳本使用方法及效果:
[code]
#./tho.sh 123456789
123,456,789.00
[/code]
打算用AWK調用tho.sh把$2改變後輸出,但在AWK中用system調用tho.sh後不能把$2傳給tho.sh
請多指教,謝謝!!
或者用其他方法實現

請教:如何在AWK中調用shell腳本,並在shell中使用AWK的變量

system("sh urscript")

請教:如何在AWK中調用shell腳本,並在shell中使用AWK的變量

#對文件中的數字進行格式化,保留小數點兩位,整數部分每三位一分割
#用法:awk -f frm_num.awk 目標文件
#文件名:frm_num.awk  

function format_number(STRING,  str,flag,str1,str2,i,j,array) {
           str=STRING       
       
        if(str ~ /^[-+]/){
                flag=substr(str,1,1)
                str=substr(str,2)
        }else
                flag=""
       
        i=index(str,"\.")
        if(i>0){
                str2=substr(str,i+1)
                str1=substr(str,1,i-1)
               
                if(length(str2)>2)
                        str2=substr(str2,1,2)
                else if(length(str2)<2)
                        str2=str2 "0"               
                       
                str2="\." str2               
        } else{
                str1=str
                str2="\.00"
        }
       
        i=0
        while(length(str1)>3){
                array[++i]=substr(str1,length(str1)-2,3)
                str1=substr(str1,1,length(str1)-3)
        }       
        array[++i]=str1
       
        str1=""
        for(j=i;j>0;j--){
                str1=str1 array[j]
                if(j>1) str1=str1 ","                       
        }
       
        str=flag str1 str2
       
        return str       
}

{
        for(m=1;m<=NF;m++)       
        {               
                if($m ~ /[-+]?[0-9]+(\.[0-9]+)?/)
                        $m=format_number($m)               
        }
       
        print
}

請教:如何在AWK中調用shell腳本,並在shell中使用AWK的變量

請教:如何在AWK中調用shell腳本,並在shell中使用AWK的變量

-->

謝謝夢藍的腳本!
但有時候我並不需要對所有的數字進行格式化,比如帳號等,而只需改變其中的一列或幾列,有沒有更好的辦法!!
謝謝!!

請教:如何在AWK中調用shell腳本,並在shell中使用AWK的變量

to () {
echo $1|rev|sed 's/.../&,/g;s/,$//;s/^/00\./'|rev}
[/code]

請教:如何在AWK中調用shell腳本,並在shell中使用AWK的變量

#對文件中的數字進行格式化,保留小數點兩位,整數部分每三位一分割
#用法:awk -f frm_num.awk 列號列表 目標文件
#最後一個參數為目標文件,其他為列號;沒有列號則對所有數據格式化
#如:awk -f frm_num.awk 1 2 3 4 "a.txt"
#文件名:frm_num.awk  

function format_number(STRING,  str,flag,str1,str2,i,j,array) {
           str=STRING       
       
        if(str ~ /^[-+]/){
                flag=substr(str,1,1)
                str=substr(str,2)
        }else
                flag=""
       
        i=index(str,"\.")
        if(i>0){
                str2=substr(str,i+1)
                str1=substr(str,1,i-1)
               
                if(length(str2)>2)
                        str2=substr(str2,1,2)
                else if(length(str2)<2)
                        str2=str2 "0"               
                       
                str2="\." str2               
        } else{
                str1=str
                str2="\.00"
        }
       
        i=0
        while(length(str1)>3){
                array[++i]=substr(str1,length(str1)-2,3)
                str1=substr(str1,1,length(str1)-3)
        }       
        array[++i]=str1
       
        str1=""
        for(j=i;j>0;j--){
                str1=str1 array[j]
                if(j>1) str1=str1 ","                       
        }
       
        str=flag str1 str2
       
        return str       
}

BEGIN{
        for(i=1;i<ARGC-1;i++){
                col_list[ARGV[i]]=""
                delete ARGV[i]
        }
       
        if(ARGC<=2)
                flag=0       
        else
                flag=1
}

{
        for(m=1;m<=NF;m++)       
        {               
                if((flag==0 || m in col_list) && $m ~ /[-+]?[0-9]+(\.[0-9]+)?/)
                        $m=format_number($m)               
        }
       
        print
}



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 藍森林網站 版權所有。 E-mail : webmaster@lslnet.com