說明:藍色=命令名稱數組
淺綠=命令參數ide
淺藍=選項函數
紫色=目錄測試
系統環境:CentOS 6.2 i686spa
有文件,包含的內容以下:3d
去除重複列結果以下:blog
方法:awk '{for(i=1;i<=NF;i++)a[$i,NR]++}{for(j in a){split(j,b,SUBSEP);if(b[2]==NR)printf b[1]" "} printf "\n"}' file字符串
說明:本方法巧妙的利用了awk的數組,a[$i,NR]將讀入的數據以域和行號爲下標,只要本行的列中有重複數據則以該數據和該行行號爲下標的數組元素加1。後面經過for循環取出下標,用split(j,b,SUBSEP)將兩個下標分離賦值給新的數組b,此時b[1]中的數據就是咱們想要的(不重複的列),最後判斷b[2]與行號相等的則打印b[1]。執行命令後結果以下:get
若是隻想打印重複列,只需a數組的之是否大於1:awk '{for(i=1;i<=NF;i++)a[$i,NR]++}{for(j in a){split(j,b,SUBSEP);if(b[2]==NR&&a[b[1],NR]>1)printf b[1]" "} printf "\n"}' fileit
執行結果以下:
補充:
awk的二維數組使用
awk的多維數組在本質上是一維數組,更確切一點,awk在存儲上並不支持多維數組。awk提供了邏輯上模擬二維數組的訪問方式。例如,array[2,4] = 1這樣的訪問是容許的。awk使用一個特殊的字符串SUBSEP (\034)做爲分割字段,在上面的例子中,關聯數組array存儲的鍵值其實是2\0344。
相似一維數組的成員測試,多維數組能夠使用 if ( (i,j) in array)這樣的語法,可是下標必須放置在圓括號中。
相似一維數組的循環訪問,多維數組使用 for ( item in array )這樣的語法遍歷數組。與一維數組不一樣的是,多維數組必須使用split()函數來訪問單獨的下標份量。split ( item, subscr, SUBSEP)。