好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > awk實現Left、join查詢、去除重復值以及局部變量講解例子

awk實現Left、join查詢、去除重復值以及局部變量講解例子

熱門標簽:杭州機器人外呼系統 陜西電銷卡外呼系統怎么安裝 excel地址地圖標注 百度地圖標注圖標更換 地圖標注超出范圍怎么辦 旅游地圖標注大全 百度地圖的地圖標注 東莞電銷機器人價格一覽表 佛山高德地圖標注中心

最近看到論壇里面有幾個不錯的小例子,對于學習awk還是有幫助,在這兒詳細的說一下

一、類似數據庫中的left join查詢

復制代碼 代碼如下:

[root@krlcgcms01 mytest]# cat a.txt    //a.txt
111   aaa
222   bbb
333   cccc
444   ddd
[root@krlcgcms01 mytest]# cat b.txt    //b.txt
111  123  456
2    abc  cbd
444  rts  786


要求輸出結果是
111,aaa,123,456
444,ddd,rts,786

實現方法:

復制代碼 代碼如下:

[root@krlcgcms01 mytest]# awk 'NR==FNR{a[$1]=$2;}NR!=FNR a[$1]{print $1","a[$1]","$2","$3}' a.txt b.txt
111,aaa,123,456
444,ddd,rts,786

解釋:當NR和FNR相同時,這就說明在對第一個文件進行操作,a[$1]=$2表示,建立一個數組,以第一個字段為下標,第二個字段為值。當NR!=FNR時,說明在對第二個文件進行操作,注意:這個時候的$1和前面的$1不是同一個東西了,前面的$1表示的是a.txt的第一個字段,而后面的$1表示的是b.txt的第一個字段。a[$1]表示以b.txt中第一個字段的為下標的值,如果a[$1]有值的話,說明也存在于a.txt文件中,這樣就把數據print出來就行了。

實現方法2:

復制代碼 代碼如下:

[root@krlcgcms01 mytest]# awk -v OFS="," 'NR==FNR{a[$1]=$2;} NR!=FNR $1 in a { print $1,a[$1],$2,$3}' a.txt b.txt
111,aaa,123,456
444,ddd,rts,786

解釋:-v OFS=","這個是設置輸出時的列分割符,$1 in a這個是b.txt文件中的第一列的值是不是在數組a的key中,這個對做程序的來說很好理解,各種語言當中都有這樣的用法,或者函數。例如,php中有in_array函數。比較一下,方法1和方法2中的print,方法1我加了雙引號,方法2我卻沒有加,但是輸出的效果卻是一樣的。

二、去除重復的值

復制代碼 代碼如下:

[root@krlcgcms01 mytest]# cat repea   //文件repea
 a b
 c d
 e f
 b d
 b a
 f e
 1 2
 2 1

如果有a,b和b,a這樣的情況,就刪除b,a,當然數字也一樣;

實現方法1:

復制代碼 代碼如下:

awk '{for(i=1;i=NF;i++)a[i]=$i;asort(a);for(i=1;i=length(a);i++)printf a[i]"\t";printf "\n"}' repea|sort|uniq
1       2
a       b
b       d
c       d
e       f

解釋:for(i=1;i=NF;i++)a[i]=$i;將每一列中的二個字段放到數組中,asort(a),這個數組進行排序,后面的代碼是將數組數據輸出來,通sort命令對輸入的數據進行排序,相同數據會排在一起,通過uniq來進行去除相同的列。這種方法比較有通用性,不光適合二列,三列,四列都行。不過效率差了點。

實現方法2:

復制代碼 代碼如下:

[root@krlcgcms01 mytest]# awk '{a[$0]=$0;if (!($2 OFS $1 in a)) print a[$0] }' repea
a b
c d
e f
b d
1 2
[root@krlcgcms01 mytest]# awk '{a[$0];if (!($2 OFS $1 in a)) print  }' repea   
a b
c d
e f
b d
1 2

解釋:方法2的二種寫法,出來的結果是一樣的,a[$0];沒有賦值也沒有報錯,為什么呢?awk在遇到這樣沒有定義的變量時,會給它一個初值。if (!($2 OFS $1 in a))表示返轉字段不在數組a中,這里所說的在,表示key是不是存在,不是值。print 不寫默認是一行。

實現方法3:

復制代碼 代碼如下:

[root@krlcgcms01 mytest]# awk '!a[$1_$2]++!a[$2_$1]++' repea
a b
c d
e f
b d
1 2
[root@krlcgcms01 mytest]# awk '{if(!a[$1_$2]++!a[$2_$1]++)print $0;}' repea
a b
c d
e f
b d
1 2

解釋:!a[$1_$2]++!a[$2_$1]++等于if(!a[$1_$2]++!a[$2_$1]++),對于首次出現的記錄,a[$2_$1]的值是未定義的,由于后面的 ++ 是數學計算,所以a[$2_$1]會被賦值成數字0,也是由于 ++ 操作符,會先取值,再計算,從左到右 ++ 運算符的優先級大于!運算符的,所以對于第一行記錄實際上是if(! 0) print $0     ! 是取反,0 是假,! 0 就是真,那么就會執行后面的 print $0對于后面出現的重復記錄,a[$0] 經過 ++ 的計算已經變為 1、2、3 。。。而 ! 1  ! 2  ! 3 ... 都為假,不會打印。

三、awk的局部變量

這個例子來說明一下,awk怪異的局部變量

復制代碼 代碼如下:

[root@krlcgcms01 mytest]# cat sum 
 1       2 
 2       3 
 a       b 
 3       2 
 4       1 
 3       r 

把都是數字的行,最大的那個數字加起來,第一行是2,第二行是3,每四行是3,第五行是4,總和是12

復制代碼 代碼如下:

function max(one,two){
 if(one > two){
 sum = sum + one;
 }else{
 sum  = sum + two;
 }
 }

{if($1~"[0-9]" $2~"[0-9]") max($1,$2);}
 END{print "sum="sum}


在max方法里面,變量sum是會影響外面的,這里的sum是全局的。
[root@krlcgcms01 mytest]# awk -f add.sh sum
sum=12

復制代碼 代碼如下:

function max(one,two,sum){    //方法中的sum局部變量
if(one > two){
sum = sum + one;
}else{
sum  = sum + two;
}
}

{if($1~"[0-9]" $2~"[0-9]") max($1,$2,sum);}

END{print "sum="sum}         //所以為空

[root@krlcgcms01 mytest]# awk -f add.sh sum
sum=

復制代碼 代碼如下:

function max(one,two,sum){
 if(one > two){
 sum = sum + one;
 }else{
 sum  = sum + two;

 }

  return  sum                 //加上return就可以了
 }

{if($1~"[0-9]" $2~"[0-9]") sum = max($1,$2,sum);}

END{print "sum="sum}

標簽:朝陽 西藏 通遼 隨州 青島 南充 延邊 雅安

巨人網絡通訊聲明:本文標題《awk實現Left、join查詢、去除重復值以及局部變量講解例子》,本文關鍵詞  awk,實現,Left,join,查詢,去除,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《awk實現Left、join查詢、去除重復值以及局部變量講解例子》相關的同類信息!
  • 本頁收集關于awk實現Left、join查詢、去除重復值以及局部變量講解例子的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 免费观看黄色小说| 将军猛烈顶弄H| 亚洲AV无码久久888精小说| 成人精品视频99在线观看免费 | 岛国搬运工www美利坚| 裸体做a爰片毛片A片免费| 男人在女身上曰皮视频| 特黄特色大片免费视频播放| 日本激情视频在线观看| 女骚毛大隂户XXXHD| 亚洲卡一卡二卡三| 免费看污软件| 91精品成人| 国产做爰XXXⅩ高潮网站多少集| 情妇在线| 我的女友小莹| 无码国产成人777爽死| 凹凸熟女白浆精品视频10| 性一交一乱一A片天美传媒| 深夜h视频| 一级欧美| 国产欧美另类精品久久久| 男男GayXXX军人呻吟动漫| 亚洲偷偷自拍| 嗯啊好深| 美女脱??露出??吃我的??| 日日噜噜噜夜夜爽爽狠狠视频97| gogo西西人体大尺寸大胆高清图片 | 久久97精品久久久久久久看片| 国产好深好硬好爽我还要视频| 69人人妻人人澡人人爽国产DVD | 日本全棵写真图片| 91在线无码精品秘?蜜桃原神 | 黑人巨大精品欧美在线观看| 欧美Av又水又骚又爽免费观看| 日本大乳 一级毛片| 91麻豆精产国品一二区灌醉| 中国黄色网址大全| 古代h嗯啊~乱女| 青青小说| 色偷偷WWWW88888免费|