亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Linux Shell > 正文

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

2020-07-27 19:14:31
字體:
來源:轉載
供稿:網友

最近看到論壇里面有幾個不錯的小例子,對于學習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}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久噜噜噜久久中文字免| 亚洲aaa激情| 日韩精品免费在线观看| 国产精品免费观看在线| 成人激情视频在线播放| 69视频在线免费观看| 韩国日本不卡在线| 91精品中国老女人| 成人福利在线观看| 国产精品激情av在线播放| 久久中国妇女中文字幕| 欧美日韩午夜剧场| 精品一区二区三区四区在线| 日韩中文字幕第一页| 91亚洲精品在线观看| 久久久久久久久国产精品| 精品伊人久久97| 国产精品综合不卡av| 久久久久久国产三级电影| 精品亚洲男同gayvideo网站| 亚洲精品在线91| 国产精品久久99久久| 日本精品一区二区三区在线播放视频| 91国产在线精品| 91av在线网站| 亚洲一区二区三区777| 欧美洲成人男女午夜视频| 精品综合久久久久久97| 97视频免费在线看| 国外视频精品毛片| 欧美丝袜一区二区三区| 欧美猛交ⅹxxx乱大交视频| 国产91成人video| 欧美视频在线观看 亚洲欧| 久久久亚洲国产天美传媒修理工| 亚洲2020天天堂在线观看| 国产精品视频久| 欧美电影免费观看高清完整| 欧美在线影院在线视频| 欧美一区二区三区免费观看| 国产精品精品一区二区三区午夜版| 欧美激情a∨在线视频播放| 日本道色综合久久影院| 欧美成人中文字幕| 精品久久久久久久久久国产| 国产精品三级久久久久久电影| 91精品视频在线免费观看| 浅井舞香一区二区| 亚洲精品欧美极品| 国产精品欧美激情在线播放| 亚洲成人激情在线观看| 国产欧美一区二区三区久久| 国外视频精品毛片| 亚洲第一综合天堂另类专| 日韩精品在线私人| 日本精品免费一区二区三区| 日韩av综合中文字幕| 日韩美女在线看| 6080yy精品一区二区三区| 日韩免费在线电影| 国产亚洲成av人片在线观看桃| 欧美性高跟鞋xxxxhd| 97久久伊人激情网| 97久久精品国产| 日韩精品有码在线观看| 成人两性免费视频| 亚洲精品999| 国产精品va在线播放我和闺蜜| 国产精品88a∨| 91国产美女视频| 精品中文字幕久久久久久| 亚洲人成电影网站色xx| 奇米四色中文综合久久| 久久视频中文字幕| 中文字幕日韩欧美在线| 久久久久久久久久久免费| 亚洲精品久久久一区二区三区| 911国产网站尤物在线观看| 亚洲欧美日本伦理| 日韩av在线电影网| 北条麻妃久久精品| 亚洲91精品在线观看| 在线免费看av不卡| 伊人成人开心激情综合网| 欧美在线不卡区| 国产精品亚洲аv天堂网| 国产精品久久久久91| 日韩av网站电影| 日韩男女性生活视频| 亚洲性69xxxbbb| 成人福利在线视频| 97视频人免费观看| 国产精国产精品| 久久人人看视频| 韩国欧美亚洲国产| 国产精品白嫩美女在线观看| 精品无人区乱码1区2区3区在线| 中文字幕在线观看亚洲| 亚洲一区国产精品| 国产欧美日韩最新| 国产精品久久9| 国产欧美一区二区| 日韩精品黄色网| 最新国产成人av网站网址麻豆| 日韩av成人在线| 日本精品视频在线观看| 中文字幕日韩欧美精品在线观看| 欧美伦理91i| 欧美高清在线视频观看不卡| 成人激情综合网| 在线性视频日韩欧美| 欧美成人中文字幕在线| 亚洲有声小说3d| 一区二区亚洲精品国产| 精品国产一区二区三区久久狼黑人| 欧美激情免费视频| 国产成人鲁鲁免费视频a| 欧美国产日韩视频| 国产99久久久欧美黑人| 国产精品成人播放| 日韩中文字幕在线| 国产欧美欧洲在线观看| 欧美日韩国产综合视频在线观看中文| 亚洲色图50p| 精品国产乱码久久久久久虫虫漫画| 久久久久久久久亚洲| 国产精品女主播视频| 欧美一区二区视频97| 国产91精品不卡视频| 久久精品国产清自在天天线| 日韩中文字幕不卡视频| 亚洲黄在线观看| 亚洲人精品午夜在线观看| 日韩成人小视频| 91欧美激情另类亚洲| 国产成人综合一区二区三区| 亚洲人成在线电影| 日韩视频永久免费观看| 欧美日韩一区二区免费视频| 国模极品一区二区三区| 日韩av电影在线网| 欧美成aaa人片免费看| 亚洲精品福利视频| 久久精品中文字幕| 91免费看国产| 国内免费精品永久在线视频| 欧美裸体男粗大视频在线观看| 久久久极品av| 欧美激情精品久久久久久变态| 欧美xxxx综合视频| 午夜精品久久久久久99热软件| 91精品国产91久久久| 性色av一区二区三区红粉影视| 国产a级全部精品| 日韩在线观看免费av| 国产精品久久久久久久久久新婚| 欧美成人精品在线| 日韩精品视频在线观看网址| 亚洲精品一区二区三区婷婷月| 日韩精品在线免费播放| 日韩在线视频二区| 久久国产精品久久久久久| 91超碰caoporn97人人| 亚洲最新av在线网站|