亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 5363 | 回復: 14
打印 上一主題 下一主題

[文本處理] awk變量傳遞問題 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-07-03 09:47 |只看該作者 |倒序瀏覽
本帖最后由 linux_kaige 于 2013-07-03 10:02 編輯

各位好,為了格式化處理一些數(shù)據(jù),想用awk來做,可是遇到個問題,關(guān)于awk引用外部變量的用法,在網(wǎng)上也查了一些資料,故發(fā)帖請大家?guī)兔鉀Q下。
示例:
#!/bin/bash
a=(信用卡  借記卡  網(wǎng)銀    柜面)
for((i=0;i<${#a[@]};i++))
do
awk '{if ($15==${a})sum=sum+1}END{print ${a},sum}'  require.txt
done

我的目的就是那數(shù)組a中的值,與文件require中的第15列對比,如果一樣的話,就加1,得出如信用卡  13;借記卡  9;網(wǎng)銀 21 等等?赡艽蠹矣幸蓡,直接使用一條awk語句,就可以得出,或者sort |uniq -c |sort -nr 得出結(jié)果,但我需要的是按照一定的a中的順序輸出,最終要直接貼出報表里面,所以這些不能滿足我的要求,我現(xiàn)在的問題是在上面腳本里面的$15==${a}報錯:

awk: {if(5==信用卡-計劃財務部){sum=sum+1}}END{print sum}
awk:        ^ invalid char '' in expression

應該怎么寫才對?


謝謝!

論壇徽章:
50
15-16賽季CBA聯(lián)賽之廣夏
日期:2018-11-05 09:42:462015年亞冠紀念徽章
日期:2015-07-23 11:58:122015亞冠之廣州富力
日期:2015-07-07 08:26:172015亞冠之塔什干棉農(nóng)
日期:2015-06-29 09:08:072015年亞洲杯之伊朗
日期:2015-03-08 20:51:012015年迎新春徽章
日期:2015-03-04 09:58:11未羊
日期:2014-10-16 22:41:47處女座
日期:2014-10-16 15:33:33酉雞
日期:2014-03-13 12:54:10巳蛇
日期:2014-03-10 14:39:052015亞冠之德黑蘭石油
日期:2015-07-29 12:46:372015亞冠之德黑蘭石油
日期:2015-08-07 12:54:11
2 [報告]
發(fā)表于 2013-07-03 09:54 |只看該作者
給個提示:
[WilliBhamlll@CC ~]$ a=(信用卡  借記卡  網(wǎng)銀   柜面)
[WilliBhamlll@CC ~]$ awk 'BEGIN{print "'${a[0]}'"}'         
信用卡
[WilliBhamlll@CC ~]$ awk 'BEGIN{print "'${a[1]}'"}'
借記卡

論壇徽章:
0
3 [報告]
發(fā)表于 2013-07-03 10:03 |只看該作者
==兩邊是不是得空格?

論壇徽章:
39
辰龍
日期:2013-08-21 15:45:192015亞冠之廣州富力
日期:2015-05-12 16:34:52亥豬
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17雙魚座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亞冠之卡爾希納薩夫
日期:2015-05-24 15:24:35黃金圣斗士
日期:2015-12-02 17:25:0815-16賽季CBA聯(lián)賽之吉林
日期:2017-06-24 16:43:52
4 [報告]
發(fā)表于 2013-07-03 10:08 |只看該作者
本帖最后由 關(guān)陰月飛 于 2013-07-03 10:08 編輯

回復 1# linux_kaige


    傳遞變量還是用-v 吧,比較清晰
  1. #!/bin/bash
  2. a=(信用卡  借記卡  網(wǎng)銀    柜面)
  3. for((i=0;i<${#a[@]};i++))
  4. do
  5. awk  -va=${a[i]} '{if ($15==a)sum=sum+1}END{print a,sum}'  require.txt
  6. done
復制代碼

論壇徽章:
93
2015年辭舊歲徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年紀念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大;照
日期:2019-10-10 10:55:38季節(jié)之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季節(jié)之章:冬
日期:2019-10-10 10:57:17CU大;照
日期:2014-02-21 14:22:52CU大;照
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
5 [報告]
發(fā)表于 2013-07-03 10:21 |只看該作者
  1. #!/bin/bash
  2. a=(信用卡  借記卡  網(wǎng)銀    柜面)
  3. for((i=0;i<${#a[@]};i++))
  4. do
  5. awk -v type=${a[i]} '{if ($15==type)sum=sum+1}END{print type,sum}'  require.txt
  6. done
復制代碼

論壇徽章:
93
2015年辭舊歲徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年紀念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大;照
日期:2019-10-10 10:55:38季節(jié)之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季節(jié)之章:冬
日期:2019-10-10 10:57:17CU大;照
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大;照
日期:2014-02-21 14:23:15
6 [報告]
發(fā)表于 2013-07-03 10:22 |只看該作者
咦,貼完發(fā)現(xiàn)到地板了,還有和地板一樣的板凳……

論壇徽章:
0
7 [報告]
發(fā)表于 2013-07-03 10:34 |只看該作者
回復 2# WilliBhamlll

多謝你的提示!看來我的對雙引號、單引號理解的還不夠啊,呵呵!


   

論壇徽章:
0
8 [報告]
發(fā)表于 2013-07-03 10:40 |只看該作者
本帖最后由 linux_kaige 于 2013-07-03 11:01 編輯

謝謝各位,已解決,下面兩種方法都可以。
[root@yang yangkai]# cat  report.sh
#!/bin/bash
#kaige 2013-07-02
a=(信用卡-計劃財務部 信用卡-市場企劃部 信用卡-行銷推廣部 信用卡-商務發(fā)展部 信用卡-風險管理部 信用卡-客戶服務部 信用卡-作業(yè)部 信用卡-法律與合規(guī)部 信用卡-信息技術(shù)部 信用卡-策略發(fā)展部 信用卡-電話營銷中心 信用卡-招贏商務 零售部-業(yè)務管理室 零售部-交易處理室 零售部-項目開發(fā)室 零售部-市場營銷室 零售部-個人信貸室 零售部-證券處理中心 零售部-財富管理室 零售部-電子銀行室 零售部-服務管理室 零售部-個貸風險管理室 零售部-私人銀行 遠程銀行中心-遠程銀行室 遠程銀行中心-電話室)
b=(信用卡 零售CRM 收單業(yè)務 柜面業(yè)務 自助設備 個人網(wǎng)銀 一網(wǎng)通 電話銀行 通知平臺 零售中間業(yè)務 零售負債 支付結(jié)算 零售基礎(chǔ)業(yè)務 I理財 電子商務)
#for(i=0;i<${#a[@]})i in 1 .. $((${#a[@]}-1))
for((i=0;i<${#a[@]};i++))
do
#awk -F"[\t]" 'BEGIN{sum=0}{if($15=="'${a}'"){sum=sum+1}}END{print "'${a}'",sum}' require.t
awk -F"[\t]" -v arr=${a} 'BEGIN{sum=0}{if($15==arr){sum=sum+1}}END{print arr,sum}' require.t
done
[root@yang yangkai]# sh  report.sh
信用卡-計劃財務部 2
信用卡-市場企劃部 8
信用卡-行銷推廣部 5
信用卡-商務發(fā)展部 1
信用卡-風險管理部 11
信用卡-客戶服務部 24
信用卡-作業(yè)部 16
信用卡-法律與合規(guī)部 0
信用卡-信息技術(shù)部 20
信用卡-策略發(fā)展部 0
信用卡-電話營銷中心 0
信用卡-招贏商務 6
零售部-業(yè)務管理室 2
零售部-交易處理室 1
零售部-項目開發(fā)室 33
零售部-市場營銷室 4
零售部-個人信貸室 0
零售部-證券處理中心 0
零售部-財富管理室 3
零售部-電子銀行室 7
零售部-服務管理室 0
零售部-個貸風險管理室 0
零售部-私人銀行 3
遠程銀行中心-遠程銀行室 3
遠程銀行中心-電話室 0
[root@yang yangkai]#
------------------------------------------------------最終格式化輸出的腳本----------------------------------------------
[root@yang yangkai]# cat report.sh
#!/bin/bash
#kaige 2013-07-02
a=(信用卡-計劃財務部 信用卡-市場企劃部 信用卡-行銷推廣部 信用卡-商務發(fā)展部 信用卡-風險管理部 信用卡-客戶服務部 信用卡-作業(yè)部 信用卡-法律與合規(guī)部 信用卡-信息技術(shù)部 信用卡-策略發(fā)展部 信用卡-電話營銷中心 信用卡-招贏商務 零售部-業(yè)務管理室 零售部-交易處理室 零售部-項目開發(fā)室 零售部-市場營銷室 零售部-個人信貸室 零售部-證券處理中心 零售部-財富管理室 零售部-電子銀行室 零售部-服務管理室 零售部-個貸風險管理室 零售部-私人銀行 遠程銀行中心-遠程銀行室 遠程銀行中心-電話室)
b=(信用卡 零售CRM 收單業(yè)務 柜面業(yè)務 自助設備 個人網(wǎng)銀 一網(wǎng)通 電話銀行 通知平臺 零售中間業(yè)務 零售負債 支付結(jié)算 零售基礎(chǔ)業(yè)務 I理財 電子商務)
#for(i=0;i<${#a[@]})i in 1 .. $((${#a[@]}-1))
for((i=0;i<${#a[@]};i++))
do
for((j=0;j<${#b[@]};j++))
#awk -F"[\t]" 'BEGIN{sum=0}{if($15=="'${a}'"){sum=sum+1}}END{print "'${a}'",sum}' require.t
do
awk -F"[\t]" -v arr=${a} -v brr=${b[j]} 'BEGIN{sum=0}{if($15==arr&&$16==brr){sum=sum+1}}END{printf("%s %s %d\t",arr,brr,sum)}' require.t
done
awk 'BEGIN{printf("\n")}'
done
[root@yang yangkai]#

謝謝各位!

論壇徽章:
0
9 [報告]
發(fā)表于 2013-07-03 12:46 |只看該作者
sed或awk處理文件最后一行。
有如下的文本:
abcd 1234 fds
2011 550
1023 832er 1231

要求處理后如下所示:
abcd 1234 fds
2011 550
total1:1023 total2:832er 12end

判斷如果是文本最后一行則在第一列前面加total1:,第二列加total2:, 第三列后面減掉后面兩個字符并加end。

分別用sed與awk來實現(xiàn)。
sed:

復制代碼 代碼如下:
echo 'abcd 1234 fds
2011 550
1023 832er 1231' |sed -r '$s/([^ ]*)( )([^ ]*)( )(..).*$/total1:\1\2total:\3\4\5end/'

abcd 1234 fds
2011 550
total1:1023 total:832er 12end

awk:

復制代碼 代碼如下:
awk 'NR>1{print a}{a=$0}END{$1="total1:"$1;$2="total2:"$2;print gensub(/..$/,"end",$0)}' file

awk 'BEGIN{getline a}{print a;a=$0}END{$1="total1:"$1;$2="total2:"$2;$3=gensub(/..$/,"end",1,$3);print}'

awk '{if(!getline line){print "total1:"$1" total2:"$2" "gensub(/..$/,"end",1,$3)}else{print line?$0 RS line0}}'

本文原始鏈接:http://www.jbxue.com/article/5421.html

論壇徽章:
0
10 [報告]
發(fā)表于 2013-07-03 12:48 |只看該作者
問題:
因為某個原因,需要長期探測對某機器的ping值情況。期望的輸出格式是“丟包率 響應時間均值”。

awk中調(diào)用shell變量的例子,有需要的朋友可以參考下。

問題:
因為某個原因,需要長期探測對某機器的ping值情況。期望的輸出格式是“丟包率 響應時間均值”。

寫個小腳本,最后echo一下,自然好辦的很。不過在crontab里看到之前大都有一條任務寫的是ping 1.2.3.4,于是想:能不能讓這個腳本的內(nèi)容也盡量寫在一句話里呢?

連動命令的話,輸出結(jié)果都分了行。于是開始摸索awk的內(nèi)外變量調(diào)用問題。

網(wǎng)上說明很多,大都是BEGIN或者-v的辦法。一一試過后,發(fā)現(xiàn)其結(jié)果也都是分行顯示的。

最后找出了適用的寫法。結(jié)果全在’”`的區(qū)分上——而且我至今不知道為啥非得按如下寫法才行:
ls=`ping -c 5 1.2.3.4 | grep loss | awk -F, '{print $3}'`;ping -c 5 1.2.3.4 | grep rtt | awk -F/ '{print "'"$ls"' avg " $5 "ms"}'

執(zhí)行結(jié)果: 0% packet loss avg 17.486ms
時隔近月,在熟悉了awk的變量以后,我發(fā)現(xiàn)其實沒有這么復雜,只要下面這樣一句就簡單搞定了:
ping -c 5 1.2.3.4|awk 'BEGIN{RS="##";FS=",|/"}{print $3,$5,$8“ms”}'
執(zhí)行結(jié)果同上。

本文原始鏈接:http://www.jbxue.com/article/4988.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP