awk-處理檔案分組統計,分組求和、取最大最小值,取最大最小記錄
阿新 • • 發佈:2019-02-08
一、分組求和並排序1.存在檔案groupsum.txt原始資料如下,對下面的檔案根據第四列進行分組,並對1,2,3列進行求和。0.2 0.3 0.5 10.3 0.1 0.2 30.4 0.2 0.3 10.2 0.2 0.2 20.3 0.3 0.3 20.3 0.2 0.6 30.1 0.1 0.1 4原始資料如上統計為如下這個樣子:0.6 0.5 0.8 10.5 0.5 0.5 20.6 0.3 0.8 30.1 0.1 0.1 4實現邏輯:對每一列簡歷一個數據,陣列下標為第四列的值,當出現重複值時對其進行求和;處理完成之後再END中輸出。實現方法:awk '{a[$4]+=$1;b[$4]+=$2;c[$4]+=$3}END{for(i in a)print a[i],b[i],c[i],i}' groupsum.txt 對上述檔案,根據第四列進行分組,並對1,2,3列進行求和,並根據第四列進行倒敘排列。awk '{a[$4]+=$1;b[$4]+=$2;c[$4]+=$3}END{for(i in a)print a[i],b[i],c[i],i}' groupsum.txt |sort -k4nr對上述檔案,根據第四列進行分組,並對1,2,3列進行求和,並根據第一列進行倒敘,第二列正序輸出。awk '{a[$4]+=$1;b[$4]+=$2;c[$4]+=$3}END{for(i in a)print a[i],b[i],c[i],i}' groupsum.txt |sort -k1nr -k2n二、有如下檔案,roleid,serverid分組,取出每個角色最後一次登入時的記錄 檔案last_login 中包含roleid serverid logintime level四個欄位,檔案具體內容如下:1001 1 2018-01-01 21:00:02 101002 2 2008-01-02 22:01:02 111001 1 2018-01-01 20:58:01 91001 2 2018-01-01 21:01:02 12awk -F"\t" '{if($3>a[$1$2]) {a[$1$2]=$3;b[$1$2]=$0}}END{for(i in b) print b[i]}' last_login.txt三、分組統計還以last_login.txt 為例,以roleid和serverid分組,統計出現次數。 awk -F "\t" '{a[$1][$2]=a[$1][$2]+1}END{for (i in a) {for (j in a[i]) print i,j,a[i][j]}}' last_login.txt四、取最後一行還是以last_login.txt 為例,以roleid和serverid分組,查詢每個角色的最後一條記錄awk -F "\t" '{if (a[$1][$2] >$3 ||a[$1][$2]=="") a[$1][$2]=$0}END{for (i in a) {for (j in a[i]) print i,j,a[i][j]}}' last_login.txt