2017-08-31 54 views
1

所以我有一個文本被輸出,在一列中有一個ip地址,在另一列中有一個http狀態碼。我wan't由occurances數此列進行排序,以便在bash中按字的出現次數排序

x.x 1 
x.x 2 
x.y 1 
x.z 3 
y.x 4 
x.x 5 
x.x 4 
x.x 4 

貌似

y.x 4 
x.x 4 
x.x 4 
x.x 1 
x.y 1 
x.x 5 
x.z 3 
x.x 2 

這是狀態代碼的第二列中,IP不會忽略不需要任何進行排序特定的順序

由於4是最常見的一個,它應該是第一個,然後是1等等。

但是我能找到的所有東西都是如何使用uniq來計算出現次數,從而刪除重複項並在每行前添加一個數字。

經常的sort命令不支持這一點,據我所知也是如此。

任何幫助,將不勝感激

回答

1

您可以使用此awk + sort + cut組合:

awk 'NR==FNR{++freq[$2]; next} {print freq[$2] "\t" $0}' file{,} | sort -k1nr | cut -f 2- 
x.x 4 
x.x 4 
y.x 4 
x.x 1 
x.y 1 
x.x 2 
x.x 5 
x.z 3 

詳情:

  1. awk命令計算第二場的頻率,並增加了它的前面記錄
  2. sort命令不從最終的輸出
+1

我愛使用Schwartzian變換https://en.wikipedia.org/wiki/Schwartzian_transform – Mort

2

上頻場反向數字排序

  • cut命令條第一列隨着 GNU AWK方法:

    awk 'BEGIN{ PROCINFO["sorted_in"]="@val_num_desc" } 
        { a[$2]++; b[$2][++c]=$1 } 
        END{ for(i in a) for(j in b[i]) print b[i][j],i }' file 
    
    • PROCINFO["sorted_in"]="@val_num_desc" - 比較數組元素,其中"@val_num_desc" ensu RES,該元素的值,作爲數字處理的,從高下令低

    輸出:

    y.x 4 
    x.x 4 
    x.x 4 
    x.y 1 
    x.x 1 
    x.x 2 
    x.z 3 
    x.x 5 
    
  • 相關問題