在標準輸入上對行進行分組和計數的最佳方法?

在標準輸入上對行進行分組和計數的最佳方法?

自古以來,我就習慣... | sort | uniq -c | sort -nr對輸入行進行分組和計數,以計算輸入中每個行有多少行。

還有更好的辦法嗎?我剛剛養成了一個壞習慣嗎?有沒有更好的方法來使用將安裝在 Ubuntu Linux 18.04+ 上的標準 unix 工具(或已經存在的東西apt-get?)

答案1

我認為你有標準的、明顯的 *nix 方式。這是一個非常好的、合理的方法:

$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | sort | uniq -c | sort -nr
      2 cc
      2 aa
      1 dd
      1 bb

當然,您可以使用一個小腳本來代替,這樣就只使用一個命令。例如,與gawk

$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | 
  gawk '
    BEGIN{ PROCINFO["sorted_in"] = "@val_num_desc" }
   { count[$0]++ } 
   END{ for(line in count){ print count[line],line}}'
2 cc
2 aa
1 dd
1 bb

或者,perl:

$ printf 'aa\nbb\ncc\ndd\naa\ncc\n' | 
   perl -lne '$k{$_}++ }{ for $i (sort { $k{$b} <=> $k{$a} } keys %k ){print "$k{$i} $i"}'
2 aa
2 cc
1 bb
1 dd

但這只是重新發明輪子。另外,這兩個腳本都會重新載入記憶體中的所有輸入,這在處理大量資料時可能會出現問題。所以只要堅持你正在做的事情就好了。這是一個很好的解決方案,可能是最有效的解決方案。

相關內容