淺綠=命令參數
淺藍=選項
紫色=目錄
系統環境:CentOS 6.2 i686
有文件,包含的內容如下:
650) this.width=650;" border=0>
去除重復列結果如下:
650) this.width=650;" border=0>
方法: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]。執行命令後結果如下:
650) this.width=650;" border=0>
如果只想打印重復列,只需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"}' file
執行結果如下:
650) this.width=650;" border=0>
補充:
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)。